此代码按预期工作:
$var = "a123"
$script = @'
Add-Content C:temptest.txt -Value {{"{0} name1"}}
Add-Content C:temptest.txt -Value {{"{0} name2"}}
'@ -f $var
$command = [scriptblock]::Create($script)
Start-Process powershell.exe -Verb RunAs -ArgumentList "-NoExit -command & {$command}" -Wait
但当我将$var的值更改为"123"时,我会得到错误:
At line:1 char:49
+ & {Add-Content C:temptest.txt -Value {123 name1}
+ ~~~~~
Unexpected token 'name1' in expression or statement.
At line:2 char:46
+ Add-Content C:temptest.txt -Value {123 name2}}
+ ~~~~~
Unexpected token 'name2' in expression or statement.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken
我尝试过使用其他引号,将其转换为字符串,但我没有有效的解决方案。有人能帮忙吗?
我想我已经弄清楚了,发生了什么以及如何解决它。
问题是,一旦命令被传递给powershell.exe,当脚本块的第一个令牌没有被识别为字符串时,脚本块中的双引号就会以某种方式丢失。比较一下:
{123a name1} # Returns a script block
{123 name1} # Fails with "UnexpectedToken" exception
{$true name1} # Fails with "UnexpectedToken" exception
我不知道为什么会发生这种情况,但这就是你可以做的,解决它:
$var = "123"
$script = @'
Add-Content C:temptest.txt -Value {{'{0} name1'}}
Add-Content C:temptest.txt -Value {{'{0} name2'}}
'@ -f $var
当命令传递时,单引号会以某种方式得到维护,C:temptest.txt
中的输出如下所示:
'123 name1'
'123 name2'