在Powershell中使用 - %

Bri*_*ele 9 powershell

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

&"./plink.exe" --% $Hostname -l $Username -pw $Password $Command
Run Code Online (Sandbox Code Playgroud)

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

Mit*_*tul 9

我有同样的问题,这个问题有一个解决方法.我最近在博客上发表了关于http://mscodingblog.blogspot.com/2013/09/use-powershell-variables-after-escaping.html的博文,我从自己的答案中获取灵感,执行外部命令不接受参数

诀窍是将--%自身用作变量,并将其与powershell中的其他变量一起包含在内.

而不是这个

&"./plink.exe" --% $Hostname -l $Username -pw $Password $Command
Run Code Online (Sandbox Code Playgroud)

试试这个

$escapeparser = '--%'
& "./plink.exe" $escapeparser $Hostname -l $Username -pw $Password $Command
Run Code Online (Sandbox Code Playgroud)

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


Kei*_*ill 9

v3发布后不久我也在博客上写了这篇文章. --%将PowerShell从该字符序列转换为哑语解析器,直到行结束.这意味着你没有得到任何变量评估--%..但是,你的情况下使用环境变量,如下所示:

$env:hostname = $hostname
$env:user     = $user
$env:passwd   = $password
$env:command  = $command
.\plink.exe --% %hostname% -l %user% -pw %passwd% %Command%
Run Code Online (Sandbox Code Playgroud)

也就是说,在这种情况下,我认为没有任何理由使用 - %.这应该工作得很好:

.\plink.exe $Hostname -l $Username -pw $Password $Command
Run Code Online (Sandbox Code Playgroud)

您只想--%在EXE的命令行参数期望带有跳转PowerShell的字符的参数时使用,例如:

tf.exe status . /r /workspace:*;domain\user
Run Code Online (Sandbox Code Playgroud)

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

tf.exe status . /r --% /workspace:*;domain\user
Run Code Online (Sandbox Code Playgroud)

BTW在&这里不必使用,因为你不需要引用`.\ plink.exe'.如果文件名或路径包含空格,您只需要引用它.


Ant*_*ace 7

--%将阻止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
Run Code Online (Sandbox Code Playgroud)

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

cmd /c "path/plink.exe $Hostname -l $Username -pw $Password $Command"
Run Code Online (Sandbox Code Playgroud)

编辑:我在Powershell语言规范中挖掘了一些不相关的东西并找到了一些文档--%.我将在此发布,希望能为未来的用户在线查找更容易:

摘录自8.2"管道声明"

- %的参数表示其后面的所有参数都将以最小的解析和处理进行传递.该参数称为verbatim参数.verbatim参数之后的参数不是PowerShell表达式,即使它们是语法上有效的PowerShell表达式.

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

echoargs.exe - %"%path%"#%path%替换为值$ env:path