我看到--%
与执行带有多个参数的命令有关。我在谷歌搜索有关它的更多信息时遇到了麻烦。我怀疑谷歌认为我正在尝试一种特殊的语法。我希望能够从Powershell执行plink命令并使用变量来添加如下参数:
&"./plink.exe" --% $Hostname -l $Username -pw $Password $Command
如果我指定信息,但不能使用变量替换
,则它有效答案 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:路径