没有很好的方法来确定标准输入或标准输出是否已使用本机批处理命令重定向。
但是在您的情况下无需担心重定向。只需将 PAUSE 标准输入和标准输出重定向到 con,您不必担心之前的重定向。
pause <con >con
更新
可以干净地检测标准输入和/或标准输出和/或标准错误是否可能已被重定向。但是我还没有想出一种方法来非破坏性地确定哪些句柄被重定向。
@echo off
2>nul (5>&4 break) && (
>con echo There has been redirection
) || (
>con echo No redirection found
)
该技术依赖于这样一个事实,即无论何时重定向现有句柄,旧定义都会保存在最低可用的未定义句柄中。
如果没有任何重定向,则将2>nul
stderr 保存在 3 中,并且 4 未定义。所以5>&4
失败了,||
分支被解雇了。
如果有重定向,那么 3 已经被定义为保留重定向句柄的原始值,因此2>nul
会将 stderr 保存在 4 中(除非 4 也已被其他重定向使用)。无论哪种方式,5>&4
都会成功,因为 4 已定义,因此&&
分支将触发。
如果测试报告存在重定向,则以下至少一项必须为真:
- 标准输入重定向
- 标准输出重定向
- 标准错误重定向
- 处理 4 直接用类似 4>"log.txt" 的东西定义
- 处理 5 直接用 5>"log.txt" 之类的东西定义
不幸的是,我无法确定以上哪些是正确的,除了......
在 DosTips 上,SiberiaMan 发布了一种简单的技术来确定标准输入是否已被重定向或正在接收管道:
2>nul >nul timeout /t 0 && (
>con echo stdin not redirected or piped
) || (
>con echo stdin has been redirected or is receiving piped input
)