15

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

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

如果我指定信息,它可以工作,但不能使用变量替换。

4

3 回答 3

15

我遇到了同样的问题,并且有解决此问题的方法。从我自己的答案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

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

于 2013-09-20T18:48:11.923 回答
13

在 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'。如果文件名或路径包含空格,您只需要引用它。

于 2013-09-21T03:11:43.397 回答
8

--%将阻止 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

于 2013-09-20T18:33:03.360 回答