Ste*_*eDJ 6 parameters powershell escaping call operator-keyword
我的Powershell脚本需要使用一组非常复杂的参数调用EXE.我正在使用Powershell 3.0,并且必须坚持使用该版本.唉,即使是"魔术"逃脱的操作员(--%)也没有帮助我.例如,使用Call运算符,请考虑以下因素:
& other.exe --% action /mode fast /path:"location with spaces" /fancyparam { /dothis /dothat:"arg with spaces" } /verbose
Run Code Online (Sandbox Code Playgroud)
现在,如果它很简单,我的脚本可以很容易地正常工作.但事情并非那么简单."other.exe"的参数可能不同,具体取决于我脚本中较早的用户选择.所以相反,我需要提前建立这些参数,也许是这样的:
$commandArgs = 'action /mode ' + $userMode + ' /path:"location with spaces" /fancyparam { /dothis /dothat:"' + $userArgs + " } /verbose'
Run Code Online (Sandbox Code Playgroud)
因此我会这样调用:
& other.exe --% $commandArgs
Run Code Online (Sandbox Code Playgroud)
...好吧,期望这--%意味着它只是传递一个原始字符串$commandArgs.但是如果没有--%,powershell会自动引用$ commandArgs的内容,这些内容实际上会混淆内部引用(更不用说打破其他程序首先需要的'action'参数).换句话说,我已经尝试嵌入--%我的$ commandArgs字符串内部,但损坏已经在它被解析的时候完成了(我不认为它甚至可以这样工作).
请注意,这个例子只是我需要执行的实际命令的1/4 - 其中包括更多用户参数,引号和其他有趣的字符,这些字符会让我匆忙逃离地狱!我也一直在使用echoargs.exe工具,这就是我看到我遇到的麻烦.哦,我也需要我的例子中的所有空格(即需要在括号字符周围留出空格).
所以经过多次寻找答案后,我求助于你.提前致谢.
好吧,回答我自己的问题可能很奇怪,但昨天在这个问题上再花了一天之后,我可能已经意识到了答案.至少,这是我发现的有效.但我在这里发布以获得进一步的反馈,以防我真的做了一些不推荐的事情......使用Invoke-Expression :-)
我很早就意识到了,有些人在你的回答中证实了这一点,它--%阻止了所有进一步的扩展(包括我的$变量).我的问题是,在尝试使用Call运算符时,我仍然需要扩展很多东西(&).如果我的命令行在使用之前已准备就绪,我的问题就会解决--%,这就是我所做的.
我创建了一个新的字符串,包括:
$fullCommand = '& "other.exe" --% ' + $commandArgs
Run Code Online (Sandbox Code Playgroud)
(EXE路径实际上有空格,因此是引号.)然后,随着它的全部构建(包括--%它需要的位置),我将它作为一个新的脚本调用:
Invoke-Expression $fullCommand
Run Code Online (Sandbox Code Playgroud)
到目前为止,我的成绩非常好.但我知道在我的搜索中,Invoke-Expression听起来像是人们不应该使用的坏事.每个人的想法?
| 归档时间: |
|
| 查看次数: |
10608 次 |
| 最近记录: |