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

问题描述 投票:3回答:5

如果我们将批处理文件重定向到日志,如下所示:

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

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

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

通常情况下,这根本不是问题,但是我正在努力使这个白痴证明,因为我不会在其他脚本/计划任务中实现批处理文件。

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

windows batch-file logging cmd
5个回答
2
投票

没有好的方法可以确定是否已使用本机批处理命令重定向stdin或stdout。

但是没有必要担心你的情况下的重定向。只需将PAUSE stdin和stdout重定向到con,您就不必担心先前的重定向。

pause <con >con

Update

可以清楚地检测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被定义,所以&&分支将开火。

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

  • stdin重定向
  • 标准重定向
  • stderr重定向
  • 句柄4直接用4>“log.txt”定义
  • 句柄5直接用5>“log.txt”定义

不幸的是,除了......之外,我无法确定上述哪一项是正确的。

Over at DosTips,SiberiaMan发布了一种简单的技术来确定stdin是否已被重定向或正在接收管道:

2>nul >nul timeout /t 0 && (
  >con echo stdin not redirected or piped
) || (
  >con echo stdin has been redirected or is receiving piped input
)

1
投票

我不知道有任何方法只使用批处理和标准命令。但是,有一些技巧可以用于其他语言,如本机C或C#程序,如果它足够重要,你可以包含另一个.exe和.bat。


0
投票

标准Windows批处理文件(我知道)中没有办法确定STDOUT被重定向的位置,或者即使它被重定向。但是,您可能希望将您的使用示例写入STDERR而不是STDOUT,因此至少对文件的简单重定向将不会捕获使用信息。

示例test.cmd:

@ECHO OFF

ECHO Test output 1>&2
PAUSE 1>&2

然后叫它:

test.cmd > output.log

哪个还会输出:

Test output
Press any key to continue . . .

当然,这对于在重定向STDERR的情况下调用文件时没有任何作用。

test.cmd 2> error.log

0
投票

我想你只是问错了问题。您希望在cmd模式下找到一种以额外中断结束批处理的方法。并在批处理模式下停止而不暂停。你可以使用CMDpause这会产生一个名为cmdpause的变量例子https://www.administrator.de/wissen/batchcode-erstellen-fehler-batch-leichter-finden-184736.html https://www.dostips.com/forum/viewtopic.php?t=7257#p47510

戴夫和杰布有些东西。但我没有联系。

菲尔


0
投票

您可以检查stdout是否通过小技巧重定向。 它使用在TAB移动光标后输出退格的事实,如果在这种情况下光标应在原始位置之前移动,将创建一个错误,以便在您的日志文件中获取奇怪字符的提示。

缺点是,它将<FF><TAB>><BACKSPACE><BACKSPACE><CR><LF>输出到stdout。 当stdout是控制台时,它只是清除它。 但是当stdout被重定向到文件时,您会将这些字符附加到文件中,但可以使用有意义的文本进行注释。

@echo off
setlocal
call :createTAB_BS

echo Script started, test for redirection:
cls
( echo %%TAB%%%%BS%%%%BS%%) | ( findstr "^"  2^> nul)
if %errorlevel% EQU 0 (
    >CON echo stdout is redirected
) ELSE (
    echo stdout goes to the console
)

exit /b

:createTAB_BS
for /f "tokens=1,2 delims=," %%A in ('forfiles /p "%~dp0." /m "%~nx0" /c "cmd /c echo(0x09,0x08"') do (
    set "TAB=%%A"
    set "BS=%%B"
)
exit /b
© www.soinside.com 2019 - 2024. All rights reserved.