如何在 Invoke-Expression -Command 中转义 "at sign" (@)?
How to escape "at sign" (@) in Invoke-Expression -Command?
当我在命令行中 运行 这个命令时,它按预期工作:
C:\>p4 changes @2019/01/16,@now
...
但是当我在 powershell 脚本中使用它时,我无法让它工作。
第一次尝试:
PS C:\> Invoke-Expression -Command "p4 changes @2018/01/16, @now"
Invoke-Expression : At line:1 char:25
+ p4 changes @2018/01/16, @now
+ ~~~~
Splatted variables like '@now' cannot be part of a comma-separated list of arguments.
At line:1 char:1
+ Invoke-Expression -Command "p4 changes @2018/01/16, @now"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ParserError: (:) [Invoke-Expression], ParseException
+ FullyQualifiedErrorId : SplattingNotPermittedInArgumentList,Microsoft.PowerShell.Commands.InvokeExpressionCommand
转义逗号(成功):
PS C:\> Invoke-Expression -Command "p4 changes @2018/01/16',' @now"
p4 : Unintelligible revision specification '2018/01/16'.
At line:1 char:1
+ p4 changes @2018/01/16',' @now
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (Unintelligible ...n '2018/01/16'.:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
现在我认为问题出在 "at character" ("@") 在某种程度上被解释。但我没能用多种方法逃脱它。如何实现?
UPD 测试你的想法:
重音:
PS C:\> Invoke-Expression -Command "p4 changes `@2018/01/16',' `@now"
p4 : Unintelligible revision specification '2018/01/16'.
At line:1 char:1
+ p4 changes @2018/01/16',' @now
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (Unintelligible ...n '2018/01/16'.:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
单引号(逗号问题):
PS C:\> Invoke-Expression -Command 'p4 changes @2018/01/16, @now'
Invoke-Expression : At line:1 char:25
+ p4 changes @2018/01/16, @now
+ ~~~~
Splatted variables like '@now' cannot be part of a comma-separated list of arguments.
At line:1 char:1
+ Invoke-Expression -Command 'p4 changes @2018/01/16, @now'
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ParserError: (:) [Invoke-Expression], ParseException
+ FullyQualifiedErrorId : SplattingNotPermittedInArgumentList,Microsoft.PowerShell.Commands.InvokeExpressionCommand
停止使用双引号,如果您没有可扩展的内容,请使用单引号。请参阅 about_Quoting_Rules
的文档
否则就是别人说的,用反引号(`
)。
工作解决方案:
$cmd = @'
p4 changes @2018/01/16','@now
'@;
Invoke-Expression $cmd
当我在命令行中 运行 这个命令时,它按预期工作:
C:\>p4 changes @2019/01/16,@now
...
但是当我在 powershell 脚本中使用它时,我无法让它工作。
第一次尝试:
PS C:\> Invoke-Expression -Command "p4 changes @2018/01/16, @now"
Invoke-Expression : At line:1 char:25
+ p4 changes @2018/01/16, @now
+ ~~~~
Splatted variables like '@now' cannot be part of a comma-separated list of arguments.
At line:1 char:1
+ Invoke-Expression -Command "p4 changes @2018/01/16, @now"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ParserError: (:) [Invoke-Expression], ParseException
+ FullyQualifiedErrorId : SplattingNotPermittedInArgumentList,Microsoft.PowerShell.Commands.InvokeExpressionCommand
转义逗号(成功):
PS C:\> Invoke-Expression -Command "p4 changes @2018/01/16',' @now"
p4 : Unintelligible revision specification '2018/01/16'.
At line:1 char:1
+ p4 changes @2018/01/16',' @now
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (Unintelligible ...n '2018/01/16'.:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
现在我认为问题出在 "at character" ("@") 在某种程度上被解释。但我没能用多种方法逃脱它。如何实现?
UPD 测试你的想法:
重音:
PS C:\> Invoke-Expression -Command "p4 changes `@2018/01/16',' `@now"
p4 : Unintelligible revision specification '2018/01/16'.
At line:1 char:1
+ p4 changes @2018/01/16',' @now
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (Unintelligible ...n '2018/01/16'.:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
单引号(逗号问题):
PS C:\> Invoke-Expression -Command 'p4 changes @2018/01/16, @now'
Invoke-Expression : At line:1 char:25
+ p4 changes @2018/01/16, @now
+ ~~~~
Splatted variables like '@now' cannot be part of a comma-separated list of arguments.
At line:1 char:1
+ Invoke-Expression -Command 'p4 changes @2018/01/16, @now'
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ParserError: (:) [Invoke-Expression], ParseException
+ FullyQualifiedErrorId : SplattingNotPermittedInArgumentList,Microsoft.PowerShell.Commands.InvokeExpressionCommand
停止使用双引号,如果您没有可扩展的内容,请使用单引号。请参阅 about_Quoting_Rules
的文档否则就是别人说的,用反引号(`
)。
工作解决方案:
$cmd = @'
p4 changes @2018/01/16','@now
'@;
Invoke-Expression $cmd