我已经看到--%
有关执行具有多个参数的命令的引用。我在谷歌上搜索有关它的更多信息时遇到了麻烦。我怀疑谷歌认为我正在尝试一种特殊的语法。我希望能够从 PowerShell 执行 plink 命令并使用变量添加如下参数:
&"./plink.exe" --% $Hostname -l $Username -pw $Password $Command
如果我指定信息,它可以工作,但不能使用变量替换。
我已经看到--%
有关执行具有多个参数的命令的引用。我在谷歌上搜索有关它的更多信息时遇到了麻烦。我怀疑谷歌认为我正在尝试一种特殊的语法。我希望能够从 PowerShell 执行 plink 命令并使用变量添加如下参数:
&"./plink.exe" --% $Hostname -l $Username -pw $Password $Command
如果我指定信息,它可以工作,但不能使用变量替换。
我遇到了同样的问题,并且有解决此问题的方法。从我自己的答案Executing external command is not accepting a parameter中获得灵感后,我最近在博客上写了这篇文章(在 PowerShell v3.0 - 2013-09-17中转义解析后使用 PowerShell 变量) 。
诀窍是将--%
自身用作变量,并将其与其他变量一起包含在 PowerShell 中。
所以代替这个,
&"./plink.exe" --% $Hostname -l $Username -pw $Password $Command
尝试这个:
$escapeparser = '--%'
& "./plink.exe" $escapeparser $Hostname -l $Username -pw $Password $Command
它可能是相关的,但我在所有变量中都使用了单引号。
在 v3 发布后不久, 我也写了一篇博客。--%
将 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'。如果文件名或路径包含空格,您只需要引用它。
--%
将阻止 PowerShell 解析语句的其余部分。Jose Barreto在 TechNet 上的博客对这个问题有一个非常相关的条目。除了提供 的示例用法之外--%
,还有其他一些方法,例如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 语言规范中寻找一些不相关的东西,并找到了一些--%
. 我将其发布在这里,希望将来的用户更容易在网上找到它:
8.2“管道语句”的节选
--% 的参数表示它后面的所有参数都将以最少的解析和处理传递。此参数称为逐字参数。逐字参数后面的参数不是 PowerShell 表达式,即使它们是语法上有效的 PowerShell 表达式。
Windows PowerShell:如果命令类型是应用程序,则参数 --% 不会传递给命令。--% 之后的参数扩展了任何环境变量(由 % 包围的字符串)。例如:
echoargs.exe --% "%path%" # %path% 被替换为 $env:path