【问题标题】:Invoke-Expression command is replacing $ if exisiting into string passedInvoke-Expression 命令正在将现有的 $ 替换为传递的字符串
【发布时间】:2016-03-28 10:53:10
【问题描述】:

我正在执行一个带有一个字符串参数的 ps1 文件。字符串参数本身包含 $ 。它与某些字母组合后将其视为变量。

说明:

$variableWithDolar = 'Test$Var'
$inputString = "Testing with " + "`'$variableWithDolar`'" 
$inputString = '"' + $inputString + '"'
$scriptPath="C:\test\PrintArg.ps1"
Invoke-Expression -Command "& `"$scriptPath`" $inputString"

这里的 PrintArg.ps1 是一个 powershell 脚本,它只接受一个字符串参数并打印它。

预期输出:“使用 Test$Var 进行测试” 实际输出:“Testing with Test”

因为它将 $Var 视为空变量。

谁能帮助我如何使用 Invoke-Expression 获得预期的输出。

【问题讨论】:

  • 你为什么首先使用Invoke-Expression
  • @PetSerAl 因为我需要使用这些参数执行一些脚本
  • & $scriptPath $inputString。为什么Invoke-Expression
  • @PetSerAI 感谢您的反馈。你是对的,这样我就可以实现我正在寻找的东西,但是因为我在已经存在的代码中创造了机会,所以我需要理解为什么使用这个 Invoke-Expression 而不是这个 Invoke-Expression。你能告诉我用invoke-expression实现这一点的任何方法吗
  • 你可以写:Invoke-Expression '& $scriptPath $inputString',但这有点没有意义。如果你真的想在应用Invoke-Expression 之前将变量值嵌入到字符串中,那么你需要这样的东西:Invoke-Expression "& '$($scriptPath -replace "['‘’‚‛]", '$&$&')' '$($inputString -replace "['‘’‚‛]", '$&$&')'"。在 PowerShell v5 中,您可以使用 [System.Management.Automation.Language.CodeGeneration]::EscapeSingleQuotedStringContent 而不是 -replace

标签: c# windows powershell cmd


【解决方案1】:

一种方法是添加单引号以防止 Powershell 尝试替换 $Var。在双引号字符串中,Powershell 将执行变量替换。将第一行的双引号改为单引号,并在最后一行的 $inputString 周围添加单引号:

$variableWithDolar = 'Test$Var'
$inputString = "Testing with " + $variableWithDolar 
$scriptPath="C:\temp\PrintArg.ps1"
Invoke-Expression -Command "& `"$scriptPath`" '$inputString'"

Poweshell 中的引用可能很棘手,请查看文档以获取完整说明:https://technet.microsoft.com/en-us/library/hh847740.aspx

【讨论】:

  • 实际上我错过了一些问题。它实际上已经在单引号中。问题是它在 Invoke-Expression 期间的替换。我已经编辑了我的代码,你现在可以看一下吗。
  • 所需的更改是 Invoke-Expression 中 $inputString 周围的单引号。
  • $inputString 周围的单引号甚至不会放置 $inputString 的值
猜你喜欢
  • 2012-09-08
  • 2017-03-06
  • 2021-10-28
  • 1970-01-01
  • 2016-11-12
  • 2023-04-11
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
相关资源
最近更新 更多