【发布时间】:2011-12-20 20:25:00
【问题描述】:
我对 Powershell 还很陌生,但我在 VBScript 和 Python 方面有很多经验。我正在努力成为一名优秀的 Windows 管理员并更多地使用 Powershell。所以,这就是我想要做的: 父文件夹包含许多名为 AD 用户名的子文件夹(例如,Users\username1、Users\username2,其中 Users 是父文件夹)。我想遍历每个文件夹名称,解析出子文件夹名称,然后将其传递给 icacls 以根据用户名应用权限。我做了一个多线,因为我遇到了管道问题。这是我在尝试了几种不同的方法后得到的:
$root_folder = "c:\temp\test"
$cmd1 = "icacls "
$cmd2 = " /grant cm\"
$cmd3 = ":`(OI`)`(CI`)F"
$paths_collection = get-childitem $root_folder | foreach-object -process {$_.FullName}
foreach ($path in $paths_collection)
{$string = $path.split("\");$last = $string[-1];$command = $cmd1 + $path +$cmd2 +$last +$cmd3;invoke-expression $command}
最初并没有这么粗糙,但是当我遇到问题时,我开始将其分解。
问题 - 在 $cmd3 中,(OI)(CI) 没有完全进入调用表达式。如果我将 $cmd3 更改为 ":F" 它可以工作,但我必须使用有问题的参数设置继承。请帮忙。我整天都在为此绞尽脑汁。真的找不到任何专门处理这个问题的东西(尝试反引号,将 $command 引用为 '$command' 等)
错误: 术语“OI”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。检查拼写 的名称,或者如果包含路径,请验证路径是否正确,然后重试。 在行:1 字符:56 + icacls C:\temp\test\garthwaitm /grant domain\user1:(OI
【问题讨论】:
-
对于它的价值,字符串连接比你在这里做的要容易得多。您也可以这样做:
$command = "$cmd1$path$cmd2$last$cmd3然后打印它以查看它正在运行什么。如果你只写出那个变量,输出是什么? -
我这样做了,它正确地打印出字符串。但是,当调用 Invoke-Expression 时,它不能正确解析(我相信)。我认为 bobbymcr 在下面得到了它。不过谢谢!