gpt4 book ai didi

windows - 有没有办法检查批处理文件中的重定向?

转载 作者:可可西里 更新时间:2023-11-01 09:25:17 26 4
gpt4 key购买 nike

如果我们有一个像这样被重定向到日志的批处理文件:

C:\Testing\Example.bat > C:\Testing\Example.log

批处理文件中是否有任何方法可以确定日志文件是否发生了标准输出重定向?

基本上,我拥有的批处理文件需要向其传递三个参数。当省略参数时,批处理文件会像常规 Windows 命令一样打印一个用法示例,并抛出一个“暂停”,以便可以读取指令。但是,如果不带参数调用批处理并且它被记录下来,那么批处理文件将永远等待一个键来打破暂停,但不会在屏幕上显示任何内容。

通常这根本不是问题,但是我正在努力让这个白痴变得安全,因为我不会成为在其他脚本/计划任务中实现批处理文件的人。

在这一点上,我似乎需要完全摆脱使用暂停,但我希望有一个我不必这样做的解决方案。感谢您的帮助。

最佳答案

没有很好的方法来确定标准输入或标准输出是否已使用 native 批处理命令重定向。

但是在您的情况下无需担心重定向。只需将 PAUSE stdin 和 stdout 重定向到 con,您不必担心先前的重定向。

pause <con >con

更新

可以清楚地检测到 stdin 和/或 stdout 和/或 stderr 是否可能已被重定向。但我还没有想出一种方法来非破坏性地确定哪些句柄被重定向。

@echo off
2>nul (5>&4 break) && (
>con echo There has been redirection
) || (
>con echo No redirection found
)

该技术依赖于 whenever an existing handle is redirected, the old definition is saved in the lowest available undefined handle .

如果没有任何重定向,那么2>nul保存stderr在3,4未定义。因此 5>&4 失败,并且 || 分支被触发。

如果已经有重定向,那么3已经被定义为保留重定向句柄的原始值,所以2>nul会将stderr保存在4中(除非4也已经被使用了)一些其他重定向)。无论哪种方式,5>&4 都会成功,因为定义了 4,所以 && 分支会触发。

如果测试报告存在重定向,则至少满足以下条件之一:

  • 标准输入重定向
  • 标准输出重定向
  • 标准错误重定向
  • 直接用类似 4>"log.txt"的东西处理 4
  • 直接用 5>"log.txt"之类的东西处理 5

不幸的是,我无法确定以上哪些是正确的,除了...

Over at 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
)

关于windows - 有没有办法检查批处理文件中的重定向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15534320/

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