使用 PowerShell 启动程序,无需等待输入

Start program with PowerShell without waiting for input

我想知道这个 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

缺少的</dev/null让它无限等待输入。是否有适用于该语法的 PowerShell 替代方案?

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



有什么建议吗?

</dev/null等价于@() | ...,如下面的简化示例所示:

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

  • 管道传输一个空数组@())有效地提供了no标准输入input,[2] as </dev/null 在 POSIX-compatible shells.

    中的作用

请注意,管道 ''"`0" / [char] 0 不会 起作用,因为 PowerShell 总是 附加一个换行符 到数据,它总是作为 text.

发送

但是,可能还有一个其他问题

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

解决方法调用平台原生shell的CLI,其 | 运算符流式传输未修改的数据;原生平台 shell 也允许使用 <:

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

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

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

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

[1] 尝试使用 < 时的错误消息提到“保留供将来使用”,但不知道这个运算符是否会被实现,并且考虑到管道涵盖了它的功能我会说机会很小。

[2] 原因是 PowerShell 枚举 管道中的集合(例如数组),即它发送元素 one一个。根据定义,空集合没有元素,因此没有可发送的内容。