使用 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 /c
和 NUL
代替 /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一个。根据定义,空集合没有元素,因此没有可发送的内容。
我想知道这个 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 /c
和 NUL
代替 /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一个。根据定义,空集合没有元素,因此没有可发送的内容。