【问题标题】:Pass string with $ into Powershell script parameter将带有 $ 的字符串传递给 Powershell 脚本参数
【发布时间】:2019-10-16 02:10:32
【问题描述】:

我有一个名为 script.ps1 的 powershell 脚本

它接受一个名为-myString-myOut的参数。

如何正确地将$Test 之类的字符串传入-myString

我试过了

script.ps1 -myString '$test1' -myOut 3
script.ps1 -myString "$test1" -myOut 3

但两者都只是假设 $test 是另一个参数名称,我错过了 -myOut

编辑:反引号没有出现在 SO 中,但我将它们包括在内。

编辑2:

param (
  [string]$myString= “”, 
  [string]$myOut= “”
)

Write-Host "Hello $myString $myOut"

示例执行:

Script.ps1 -myString ‘$test’ -myOut 3

无法回忆确切的输出,但它类似于: 你好 3

【问题讨论】:

  • 正确的方法是使用单引号'$test1' - 你能展示你的脚本吗?记得只分享minimal reproducible example
  • 反引号是什么意思?你不应该在这里需要任何这些。反引号在 PowerShell 中不使用,除非作为续行元字符...
  • @robdy 已更新。
  • 请先使用cat script.ps1 显示脚本的内容,执行它,然后将完整输出粘贴到您的问题中(使用正确的格式,如mklement0 所述)。我仍然无法重现它。

标签: powershell


【解决方案1】:

如果您在 $ 前面加上一个反引号,则可以使用双引号:-myString "`$test1"

但通常的方法是使用单引号:-myString '$test1'

请注意,单引号版本应该在字符串值的两侧有两个相同的直撇号 ('),而不是反引号 (`)。

对于双引号或单引号版本,您可以使用弯曲的 Unicode 引号字符(与 SmartQuotes 在 Word 中提供的相同),但这些仅在您的会话中有效正在使用 Powershell 识别为 Unicode 的区域设置运行。如果存在区域设置不匹配,Windows 将无法正确解释此类引号(或任何其他非 ASCII 字符)。

因此,假设您使用的标点符号与会话的文本编码相匹配,这些方法应该对您有用,就像它们在这里对我一样:

PS /> type foo.ps1 # the test script
param($myString, $myOut)    
Write-Host "myString=$myString, myOut=$myOut"

PS /> ./foo.ps1 -myString "`$test1" -myOut 3 # ASCII double-quotes
myString=$test1, myOut=3

PS /> ./foo.ps1 -myString “`$test1” -myOut 3 # Unicode double-quotes
myString=$test1, myOut=3

PS /> ./foo.ps1 -myString '$test1' -myOut 3 # ASCII single-quotes 
myString=$test1, myOut=3

PS /> ./foo.ps1 -myString ‘$test1’ -myOut 3 # Unicode single-quotes
myString=$test1, myOut=3

请注意,无论您使用哪种风格的双引号,用于转义美元符号的反引号始终必须是 ASCII 反引号 `; Powershell 无法识别与该字符等效的卷曲 Unicode。

【讨论】:

  • 谢谢。当我回到我的机器上时,我会尝试两者。智能引号似乎对我不起作用。
猜你喜欢
  • 2010-09-06
  • 2014-04-13
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多