【问题标题】:Start program with PowerShell without waiting for input无需等待输入即可使用 PowerShell 启动程序
【发布时间】:2021-09-21 13:07:23
【问题描述】:

我想知道这个 Bash 命令是否可以转换为 PowerShell:

openssl s_client -showcerts -connect host:port </dev/null 2>/dev/null | openssl x509 -noout -dates

当前脚本(不工作):

.\openssl s_client -showcerts -connect host:port 2>$null | .\openssl x509 -noout -dates

缺少的&lt;/dev/null 使它无限等待输入。该语法是否有 PowerShell 替代方案?

&lt;$null 不起作用,因为&lt; 保留供将来使用。



有什么建议吗?

【问题讨论】:

  • 我没有使用 powershell 的经验,但“普通”命令 shell 使用 NUL 作为 bitbucket。你试过&lt;NUL 和 Powershell 吗?
  • 将一个空字符串通过管道传递给openssl s_client'' |.\openssl s_client ...。或者一个 NUL 字节:[char]0 |.\openssl s_client ...
  • @MathiasR.Jessen,只有@() | ... 真正提供no 输入。

标签: powershell stdin exit


【解决方案1】:

&lt;/dev/null 的等价物是@() | ...,如以下简化示例所示:

# Equivalent of `cat -n </dev/null` in Bash, for instance.
@() | cat -n
  • PowerShell 根本不支持 &lt; 运算符,从 PowerShell 7.2 开始;[1]要发送外部程序通过其标准输入流看到的数据,它必须是管道 (|) 到它,如上所示。

  • 空数组 (@()) 有效地提供 no 标准输入输入[2]&lt;/dev/null 在兼容 POSIX 的 shell 中运行。

请注意,管道 ''"`0" / [char] 0 确实不起作用,因为 PowerShell 总是将换行符附加到数据,它总是将其发送为文本

但是,可能存在其他问题

您的特定命令将两个外部程序与一个PowerShell管道连接起来,这存在无意中修改数据的风险流式传输,因为这总是涉及将第一个进程的输出解码为文本,并在将其发送到第二个进程之前重新编码为文本 - 请参阅@987654321 @了解更多信息。

解决方法调用平台原生shell的CLI,它的|操作符流数据未经修改;平台原生 shell 也允许使用 &lt;:

Windows 上,使用 cmd /cNUL 代替 /dev/null

cmd /c 'openssl s_client -showcerts -connect host:port <NUL 2>NUL | openssl x509 -noout -dates'

Unix 类平台上,使用 sh -c/dev/null 可以按原样使用):

sh -c 'openssl s_client -showcerts -connect host:port </dev/null 2>/dev/null | openssl x509 -noout -dates'

[1] 尝试使用&lt; 时的错误消息提到“保留以供将来使用”,但不知道该运算符是否会被实现,并且鉴于管道涵盖了它的功能,我我说机会渺茫。

[2] 原因是 PowerShell 枚举管道中的集合(如数组),即它一个接一个地发送元素。根据定义,一个空集合没有元素,所以没有任何东西可以发送。

【讨论】:

    猜你喜欢
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 2012-07-12
    • 2021-03-05
    • 1970-01-01
    相关资源
    最近更新 更多