gpt4 book ai didi

powershell - 我能做什么! (感叹号)什么时候使用 Read-Host?

转载 作者:行者123 更新时间:2023-12-04 17:08:16 32 4
gpt4 key购买 nike

让我们从正常行为开始。当我执行 Read-Host没有提示,我可以输入一个以感叹号开头的字符串:

PS C:\> Read-Host | Foreach-Object { Write-Host 'Entered' $_ }
!hi, mom
Entered !hi, mom

(请注意,我只通过管道将 Foreach-Object 作为输出前缀的一种简单方法。如果您在没有它的情况下执行 Read-Host,感兴趣的行为是相同的。)

但如果我给 Read-Host一个提示的论点,行为是完全不同的:
PS C:\> Read-Host 'Enter something' | Foreach-Object { Write-Host 'Entered' $_ }
Enter something: !hi, mom
"!hi, mom" cannot be recognized as a valid Prompt command.
Enter something: !!hi, mom
Entered !hi, mom

除了输入字符串之外,感叹号似乎还允许我做一些事情。 PowerShell 将感叹号解释为我正在输入某种命令来运行它,但我找不到任何关于允许的内容的文档。除了加倍感叹号以逃避它之外,我也无法弄清楚什么是有效命令。

请注意,输入必须以感叹号开头。以它结尾不会触发此行为:
PS C:\> Read-Host 'Enter something' | Foreach-Object { Write-Host 'Entered' $_ }
Enter something: hi, mom!
Entered hi, mom!

那么我可以用 ! 做什么?这里?除了转义感叹号之外,什么是有效的命令?解决方法很有用,但我实际上想知道我是否可以在这里执行代码或其他内容。

我正在使用 PowerShell 4,但这似乎是 date back要早得多。

最佳答案

tl;博士

  • Read-Host顾名思义,是特定于主机的。
  • 从 PSv5.1 开始,标准控制台主机 (控制台窗口)和,在 PSv3+ 中,ISE 也是 表现出意想不到的行为。 (在 PSv2- 中,ISE 使用其自己的 GUI Read-Host 提示,但不受影响)。
  • 该行为有效 一个看似意外暴露的无关功能 ,即 仅当 Read-Host的提示字符串参数 ( -Prompt ) 已指定。
  • 鉴于行为是 无证以这种晦涩的方式暴露 ,应该算是错误 .
  • 解决错误 如下:
  • Write-Host -NoNewline 'Enter something: '; Read-Host
  • 即:使用 Write-Host预先单独打印提示字符串(没有换行符),然后调用 Read-Host没有 -Prompt参数:

  • 要回答问题的标题,“当使用 Read-Host 时,我可以用 ! 做什么?”:没有任何用处。
    要了解原因和背景信息,请继续阅读。

    这种行为——以及对它的提示——可以追溯到 PowerShell 的第一个版本;在 post also linked to by the OP MS 员工称其为 “提示命令” ,其中一位建筑师对其进行了更详细的解释 here由@TheMadTechnician 在对该问题的评论中发现。
    注意是 在 PowerShell 本身如何提示缺少必需参数值的上下文中进行了讨论 ,这真的 应该与Read-Host没有关系 :

    当提示输入未在命令行中指定的强制参数值时(以及意外地在使用 Read-Host-Prompt 值时), !作为第一个字符(仅)开始“提示命令”:
  • !?调用手头参数(的描述)的帮助字符串。
  • Read-Host 的上下文中,提示字符串 (!) 被解释为寻求帮助的参数名称,因此没有找到帮助 ( No help is available for <prompt-string> )。
  • !""允许输入空字符串作为数组参数的参数值,同时允许输入其他值(只需按 Enter 即可立即终止提示)。
  • Read-Host 的上下文中,这只是输出一个空字符串。
  • !!允许输入文字 !
  • Χpẘ's great answer使用底层程序集的反汇编来表明,至少从 PS v3 开始,不支持其他命令。

  • linked forum post总结(强调我的):

    Note that this is an artifact of the current implementation of prompting in the PowerShell host. It's not part of the core engine. A GUI host would be unlikely to use this notation. A reasonable enhancement would be to allow the prompt command to be user-configurable.



    10 年后,该行为——至少在 Read-Host 的背景下- 既没有记录也没有配置。

    在发现上述帖子之前, jpmc26他自己发现该行为与 PowerShell 本身提示缺少必需参数的方式有关;例如。:
    # Define a test function with a mandatory parameter.
    > function foo([Parameter(Mandatory=$true,HelpMessage='fooParam help')][string]$fooParam) {}

    # Invoke the test function *without* that mandatory parameter,
    # which causes Powershell to *prompt* for it.
    > foo
    cmdlet foo at command pipeline position 1
    Supply values for the following parameters:
    (Type !? for Help.)
    fooParam: !? # !? asks for help on the parameter, which prints the HelpMessage attribute.
    fooParam help
    fooParam: # After having printed parameter help, the prompt is shown again.

    关于powershell - 我能做什么! (感叹号)什么时候使用 Read-Host?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35493056/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com