在Powershell中使用 - %

时间:2013-09-20 18:18:02

标签: powershell

我看到--%与执行带有多个参数的命令有关。我在谷歌搜索有关它的更多信息时遇到了麻烦。我怀疑谷歌认为我正在尝试一种特殊的语法。我希望能够从Powershell执行plink命令并使用变量来添加如下参数:

&"./plink.exe" --% $Hostname -l $Username -pw $Password $Command

如果我指定信息,但不能使用变量替换

,则它有效

3 个答案:

答案 0 :(得分:8)

我遇到了同样的问题,这个问题有一个解决方法。在我从自己的回答http://mscodingblog.blogspot.com/2013/09/use-powershell-variables-after-escaping.html

中获取灵感后,我最近在博客上发表了这篇文章powershell executing external command not accepting parameter

诀窍是使用--%本身作为变量,并将其与powershell中的其他变量一起包含。

所以代替这个

&"./plink.exe" --% $Hostname -l $Username -pw $Password $Command

试试这个

$escapeparser = '--%'
& "./plink.exe" $escapeparser $Hostname -l $Username -pw $Password $Command

可能有关系,但我在所有变量中都使用了单引号。

答案 1 :(得分:8)

我发送v3后不久blogged about this--%将PowerShell从该字符序列转换为一个愚蠢的解析器,直到该行的结尾。这意味着您在--%之后无法获得任何变量评估。但是,您使用的环境变量如下:

$env:hostname = $hostname
$env:user     = $user
$env:passwd   = $password
$env:command  = $command
.\plink.exe --% %hostname% -l %user% -pw %passwd% %Command%

那就是说,在这种情况下,我没有看到任何使用的理由 - %。这应该可以正常工作:

.\plink.exe $Hostname -l $Username -pw $Password $Command

当EXE的命令行参数期望带有突破PowerShell的字符的参数时,您只想使用--%

tf.exe status . /r /workspace:*;domain\user

在这种情况下,tf.exe使用;将工作区名称与工作区所有者分开,但PowerShell将;解释为语句分隔符,这会混淆tf.exe的调用。你会像这样解决它:

tf.exe status . /r --% /workspace:*;domain\user

顺便说一下,这里不需要使用&,因为你不需要引用`。\ plink.exe'。如果文件名或路径包含空格,您只需要引用它。

答案 2 :(得分:7)

--%将阻止Powershell解析语句的其余部分。 TechNet上的Jose Barreto's Blog有一个非常相关的问题。除了提供--%的示例用法之外,还有其他一些例如cmd /c可能对解决您的问题更有帮助,因为在--%似乎对您的用例有问题后,powershell无法解析变量。

--%是Powershell版本3中的新功能。

链接博客的一些示例用法:

PS C:\> ICACLS.EXE --% C:\TEST /GRANT USERS:(F)
processed file: C:\TEST
Successfully processed 1 files; Failed processing 0 files

PS C:\> ICACLS.EXE C:\TEST --% /GRANT USERS:(F)
processed file: C:\TEST
Successfully processed 1 files; Failed processing 0 files

正如我上面提到的,你可能最好尝试一个可以使用powershell变量的解决方案。 & " "cmd /c " "都会解决变量,可能是一个很好的起点。

cmd /c "path/plink.exe $Hostname -l $Username -pw $Password $Command"

编辑:我正在Powershell Language Specification中挖掘一些无关的内容,并找到--%的一些文档。我将在此发布,希望在未来的用户中更容易在线查​​找:

  

摘自8.2“管道声明”

     

- %的参数表示跟随它的所有参数都是   通过最小的解析和处理。这个论点被称为   逐字参数。 verbatim参数之后的参数不是   PowerShell表达式,即使它们在语法上是有效的PowerShell   表达式。

     

Windows PowerShell:如果命令类型为Application,则为参数    - %未传递给命令。在 - %之后的参数扩展了任何环境变量(由%包围的字符串)。例如:

     

echoargs.exe - %“%path%”#%path%将替换为该值   $ ENV:路径