Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 是否有方法检查批处理文件内的重定向?_Windows_Batch File_Logging_Cmd - Fatal编程技术网

Windows 是否有方法检查批处理文件内的重定向?

Windows 是否有方法检查批处理文件内的重定向?,windows,batch-file,logging,cmd,Windows,Batch File,Logging,Cmd,如果我们将批处理文件重定向到如下日志: C:\Testing\Example.bat > C:\Testing\Example.log 批处理文件中是否有任何方法可以确定日志文件是否发生了标准输出重定向 基本上,我的批处理文件需要传递三个参数。当忽略参数时,批处理文件将像常规Windows命令一样打印使用示例,并抛出“暂停”,以便读取指令。但是,如果批处理在没有参数的情况下被调用,并且正在被记录,那么批处理文件将永远坐在那里,等待一个键打破暂停,但不会在屏幕上显示任何内容 通常情况下,这

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

C:\Testing\Example.bat > C:\Testing\Example.log
批处理文件中是否有任何方法可以确定日志文件是否发生了标准输出重定向

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

通常情况下,这一点都不成问题,但是我正试图证明这一点,因为我不会在其他脚本/计划任务中实现批处理文件


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

我不知道使用批处理和标准命令来执行此操作的任何方法。但是,如果在.bat中加入另一个.exe对您来说非常重要,那么可以从其他语言(如本机C或C#程序)中使用一些技巧

  • 这是一种偷偷摸摸的方法。此批处理文件创建一个.com文件,然后调用它来测试标准输出句柄:

  • 这说明了如果您想编写一个简单的C#帮助程序,如何使用C#。这让我觉得它也可以从Powershell实现,但我还没有尝试过


在标准Windows批处理文件(我知道)中没有一种方法可以确定标准输出被重定向到哪里,或者甚至它是否被重定向。但是,您可能希望将您的使用示例写入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
@echo off
2>nul (5>&4 break) && (
  >con echo There has been redirection
) || (
  >con echo No redirection found
)

没有很好的方法来确定是否使用本机批处理命令重定向了stdin或stdout

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

pause <con >con
该技术依赖于以下事实:

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

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

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

  • stdin重定向
  • 标准输出重定向
  • stderr重定向
  • 直接使用类似于4>“log.txt”的内容定义句柄4
  • 直接使用类似于5>“log.txt”的内容定义句柄5
不幸的是,我不能确定以上哪一项是正确的,除了

,西伯利亚人发布了一种简单的技术,用于确定标准输入法是否已重定向或正在接收管道:

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

您可以用一个小技巧检查
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

我想你问错问题了。您希望找到一种方法,在cmd模式下以额外的中断结束批处理。并在批处理模式下停止,而不暂停。 您可以使用CMDpause 这将生成一个名为cmdpause的变量 例子

戴夫和杰布有话要说。但我没有联系


菲尔

谢谢你的快速回复。有趣的是,我更愿意完全用C#来完成这项工作,事实上,批处理文件中的大部分实际工作都来自我编写的exe文件。然而,项目管理员们却大骂犯规,因为他们想要一些不需要重新编译就可以轻松修改的东西。我支持这个概念,所以我的下一站实际上是powershell,它也被击落了,因为“我们不知道它是什么或如何使用它”。我今天好像赢不了一个。。。如果我真的这么做,他们可能会让我去Powershell,但现在我只能使用传统的DOS。你可以使用choice命令来超时,而不是使用pause。它可以检测重定向,也可以检测管道是否处于活动状态。但是你也可以阅读这个,流是如何工作的。Jeb谢谢你链接这个文档,看看流到底发生了什么当然很有趣。但是,由于设置这些示例的复杂性,我觉得这只会使批处理文件复杂化,超过我熟悉的级别。如果关键参数丢失,我就退出批处理文件,并将指令标签链接到[%1]=[/?]或[%1]==这并不能解决重定向批处理文件时出现的暂停问题。最初的目标是尝试让暂停只在直接打开时发生。我想我误解了你的目标。con解决方案将在屏幕上显示暂停消息,并正确等待键盘输入,而不考虑重定向。但是如果你想让它完全自动化而不停顿,如果有重定向的话,那么不,这个