【问题标题】:Powershell use Read-Host variables in commandPowershell 在命令中使用 Read-Host 变量
【发布时间】:2021-01-10 00:26:32
【问题描述】:

我有一个非常简单的 .ps1-script:

$prename = Read-Host 'What is your prename?'
$lastname = Read-Host 'What is your lastname?'
.\migration.exe -name=$prename -password=$lastname

无论用户输入什么,$prename 和 $lastname 都不会传递给 migration.exe - 它们是空的!

我做错了什么?

【问题讨论】:

    标签: powershell parameter-passing


    【解决方案1】:

    $prename 和 $lastname 不会传递给 migration.exe - 它们是空的!

    这些变量引用为空; 它们 - 出乎意料 - 没有扩展(插值),从 PowerShell 7.1 开始;也就是说,外部程序.\migration 意外收到以下参数逐字-name=$prename-password=$lastname

    这应该被视为一个错误 - 请参阅GitHub issue #14587

    解决方法是使用显式string interpolation ("..."):

    .\migration.exe -name="$prename" -password="$lastname"
    

    注意:在 Windows 上,部分引用保证通过原样传递给目标程序;相反,PowerShell 先执行自己的解析,然后在后台执行(基于"按需重新引用,具体取决于结果参数是否包含空格。例如,如果$prename 的值为foo
    -name=foo逐字传递给migration.exe;如果值为foo bar,
    逐字传递"-name=foo bar" - 目标程序可能会或可能不会正确处理;如果没有,您将不得不使用--%stop-parsing symbol operator - 请参阅this answer

    【讨论】:

      【解决方案2】:

      您正在传递对象 $prename 和 $lastname。您需要展开变量,以便在变量中传递值。

      .\migration.exe -name=$($prename) -password=$($lastname)
      

      【讨论】:

      • OP 的命令应该按原样工作,并且它不应该被视为错误的事实。使用$(...)subexpression operator,既不是必需的,也不是有区别的。虽然它出乎意料地在这里产生了影响,但它不是可行的解决方法 - 它也会出现故障,尽管不同。
      猜你喜欢
      • 1970-01-01
      • 2012-09-05
      • 2021-12-26
      • 2023-02-01
      • 1970-01-01
      • 2022-01-22
      • 2018-05-28
      • 1970-01-01
      相关资源
      最近更新 更多