【问题标题】:Powershell - calling icacls with parantheses included in parametersPowershell - 使用参数中包含的括号调用 icacls
【发布时间】: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 在下面得到了它。不过谢谢!

标签: powershell powershell-2.0


【解决方案1】:

只是为了补充这个老问题,在 PowerShell 3.0 中,您现在可以使用 --% 告诉 PowerShell 停止处理在线上的任何其他内容,因此您可以使用以下内容:

icacls.exe $path --% /grant "Everyone:(OI)(CI)(F)"

【讨论】:

  • 这对我有用。例如,icacls "\\foo\doo\who" /GRANT c123123:(OI)(CI)(M) 没有运行,但以下运行:icacls "\\foo\doo\who" /GRANT "c123123:(OI)(CI)(M)"
【解决方案2】:

我认为你不必要地把它复杂化了。

Powershell Community Extensions 获取echoargs.exe

看看下面是不是你想要的:

PS >.\EchoArgs.exe /grant $path "cm\$last" ":(OI)(CI)F"
Arg 0 is </grant>
Arg 1 is <c:\test>
Arg 2 is <cm\user>
Arg 3 is <:(OI)(CI)F>

然后用你想要的命令调用它:

&icacls /grant $path "cm\$last" ":(OI)(CI)F"

顺便说一句,您可以使用Split-Path 获取$last。并使用select -expand fullname 而不是foreach-object -process {$_.FullName}

【讨论】:

  • 哇,这都是很棒的信息。谢谢manojlds!就像我说的,真的很想熟悉 Powershell。从未听说过 EchoArgs.exe,看起来很棒!
  • @MattG。如果您不想下载外部应用程序,您可以简单地编写一个打印“args”元素的控制台应用程序。
【解决方案3】:

您是否尝试过在$command 周围使用引号,例如Invoke-Expression "$command"?此处讨论了防止处理括号的其他技术:http://msdn.microsoft.com/en-us/library/cc281841.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    相关资源
    最近更新 更多