如何延迟PowerShell字符串中变量的扩展?

Adi*_*bar 6 string powershell interpolation variable-expansion

无论你想要什么,我都试图找出一种方法来获取现有字符串的内容并将它们评估为双引号字符串.例如,如果我创建以下字符串:

$string = 'The $animal says "meow"'
$animal = 'cat'
Run Code Online (Sandbox Code Playgroud)

然后,Write-Host $string会产生The $animal says "meow".如何重新评估$ string,输出(或分配给新变量)The cat says "meow"


多么恼人......对评论的限制使得用反引号包含代码非常困难(如果可能的话).这是我在回复下面的zdan时发表的最后两条评论的无瑕疵版本:

----------

实际上,在考虑之后,我意识到The $animal says "meow"在没有转义双引号的情况下期望插值是不合理的,因为如果它是一个双引号字符串开始,如果双引号没有被转义,评估将会中断.所以我想答案是这是一个两步的过程:

$newstring = $string -replace '"', '`"'
iex "`"$string`""
Run Code Online (Sandbox Code Playgroud)

后人的最后一个评论:我尝试了将所有这些全部放在一条线上的方法,并且一旦你将它们提供给iex,几乎所有你想到的东西都会破坏,但是这个有效:

iex ('"' + ($string -replace '"', '`"') + '"')
Run Code Online (Sandbox Code Playgroud)

Bil*_*art 9

可能最简单的方法是

$ExecutionContext.InvokeCommand.ExpandString($var)
Run Code Online (Sandbox Code Playgroud)


zda*_*dan 6

您可以使用Invoke-Expression重新分析您的字符串 - 如下所示:

$string = 'The $animal says `"meow`"'
$animal = 'cat'
Invoke-Expression "Write-Host `"$string`""
Run Code Online (Sandbox Code Playgroud)

注意你必须在字符串中转义双引号(使用反引号)以避免混淆解析器.这包括原始字符串中的任何双引号.

另请注意,第一个命令应该是一个命令,如果需要使用结果字符串,只需使用write-output管道输出并将其分配给稍后可以使用的变量:

$result = Invoke-Expression "write-output `"$string`""
Run Code Online (Sandbox Code Playgroud)

如您的评论中所述,如果您无法修改字符串的创建以逃避双引号,则必须自己执行此操作.你也可以将它包装在一个函数中,使它看起来更清晰:

function Invoke-String($str) { 
    $escapedString =  $str -replace '"', '`"'
    Invoke-Expression "Write-Output `"$escapedString`""
}
Run Code Online (Sandbox Code Playgroud)

所以现在它看起来像这样:

# ~> $string = 'The $animal says "meow"'
# ~> $animal = 'cat'
# ~> Invoke-String $string
The cat says "meow"
Run Code Online (Sandbox Code Playgroud)