在Powershell Invoke-Expression中转义splatted变量

时间:2011-04-06 19:02:36

标签: powershell escaping

我正在尝试从Powershell调用另一个应用程序(Beyond Compare),它在典型的命令行中需要@:

C:\deploy>bcompare @static.diff

我找到了Powershell的Invoke-Expression,但是当我尝试以下操作时它会给我一个错误:

PS C:\deploy>Invoke-Expression "bcompare @static.diff"
Invoke-Expression : Cannot expand the splatted variable '@static'. Splatted variables
cannot be used as part of a property or array expression. Assign the result of the 
expression to a temporary variable then splat the temporary variable instead.
At line:1 char:18
    + Invoke-Expression <<<<  "bcompare @static.diff"
    + CategoryInfo          : ParserError: (:) [Invoke-Expression], ParseException
    + FullyQualifiedErrorId : NoPropertiesInSplatting,Microsoft.PowerShell.Comands.InvokeExpressionCommand

我无法让@在这里正确逃脱。我已经尝试了`,@ @,将命令的一部分放在一个临时变量中,但没有一个能做到这一点。

4 个答案:

答案 0 :(得分:10)

bcompare '@static.diff'

如果有疑问,请将其放入字符串中: - )

PS Home:\> args '@static.diff'
argv[0] = "C:\Users\Joey\Batches\args.cmd"
argv[1] = @static.diff

答案 1 :(得分:4)

你需要双倍逃避,因为你正在经历两个层面的解释。只有一个`不起作用,因为它在字符串创建过程中被解析。

Invoke-Expression "bcompare ``@static.diff"

或正如乔伊所说。

Invoke-Expression "bcompare '@static.diff'"

答案 2 :(得分:1)

当我遇到同样的问题时,我使用反引号来对@ -sign进行字面解释。我也希望使用双引号进行变量处理:

  
    

Invoke-Expression“&amp; bcompare` @ $ compareCommands $ file1 $ file2”

  

答案 3 :(得分:-1)

在Windows命令行上的 npm install 上出现错误

拼写运算符'@'不能用于引用表达式中的变量。

npm install @neville.dabreo/greetingbot

The splatting operator '@' cannot be used to reference variables in an expression.

但是单引号解决了问题

npm install '@neville.dabreo/greetingbot'

注意-NPM官方网站没有提及单引号。