我有一个问题,我的批处理在一个网络驱动器上,并不是所有的人都有这个路径的写权限。通常,批处理也会记录一些信息。
我想在没有写许可的情况下取消permission denied
信息。我的假设是,我必须将标准错误重定向到nul
。
但这个例子行不通。我会得到一个permission denied
。如果没有创建日志,也可以,但我不想看到permission denied
错误消息。此错误消息应重定向到stderr
。
echo test 1> c:\Windows\log.txt 2> nul
发布于 2017-01-14 01:16:39
如果您使用的语法
echo data >log.txt 2>nul
您请求将echo
命令生成的输出发送到日志文件,并将该命令生成的错误发送到nul。
您的问题是,对stderr的输出不是由执行echo
命令生成的,而是由于重定向处理在echo
本身之前执行的芦丁失败而产生的。
您需要将stderr重定向操作向上移动一个级别。
2>nul ( >log.txt echo data )
现在,stderr重定向封装了括号内的所有内容,即重定向操作和echo
执行。
发布于 2017-01-14 01:35:42
命令行
echo test > c:\Windows\log.txt 2> nul
将命令ECHO的标准输出重定向到c:\Windows\log.txt
文件,并将命令ECHO的标准错误输出重定向到device NUL。
因此,带有重定向操作符之前的空间的test
被写入c:\Windows\log.txt
,这通常不能工作,因为这个目录是写保护的,并在这里用作具有单独访问权限的网络文件夹的示例。
命令ECHO从不输出处理STDERR的内容。因此,将命令ECHO的标准错误输出重定向到设备NUL没有任何影响。
您真正想要的是在将cmd
回显输出重定向到可能受保护的文件夹中的文件log.txt
时取消的错误输出,这需要不同的语法。
你可以用:
(>"%SystemRoot%\log.txt" echo test) 2>nul
或更容易阅读:
@echo off
(
>"%SystemRoot%\log.txt" echo test
) 2>nul
回显命令行包含在一个命令块中,从开始的圆括号(
开始,以匹配的结束括号)
结尾。此命令块中任何用于处理STDERR的命令输出的所有内容都被重定向到device NUL,如果当前用户没有在输出目录中创建文件log.txt
的权限,或者输出文件已经存在并具有只读属性集,或者如果输出文件当前由一个应用程序打开,该应用程序使用其他应用程序的文件共享写锁打开该文件,则该将包含cmd
输出的错误消息。
重定向操作符>
和文件名在回显命令行中指定,以便在开始时能够输出数字为1
. 9
的文本,而无需将尾随空格写入文件%SystemRoot%\log.txt
。
由于命令块在回显命令行周围使用,ECHO结束圆括号)
的输出现在需要用插入字符^
转义该字符,如下面的示例所示:
@echo off
(
>"%SystemRoot%\log.txt" echo '(' and '^)' are round brackets/parentheses.
) 2>nul
另一种较慢的替代解决方案是使用延迟扩展:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "TextToOutput='(' and ')' are round brackets/parentheses. '!' is an exclamation mark."
setlocal EnableDelayedExpansion
(
echo !TextToOutput!>%SystemRoot%\log.txt
) 2>nul
endlocal
endlocal
在执行%SystemRoot%
. )
中的第一行之前,在执行(
命令解释器解析整个命令块时,C:\Windows
已经被C:\Windows
(或任何通往(
目录的路径)所取代。但是环境变量TextToOutput
的值在执行ECHO之前并没有替换,因此现在可以安全地在结束时指定重定向操作符,而之前没有空格,以避免输出行上的文件中有尾随空间。
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在那里执行以下命令,并非常仔细地读取为每个命令显示的所有帮助页。
cmd /?
echo /?
endlocal /?
set /?
setlocal /?
并阅读微软TechNet的文章使用命令重定向运算符。
使用完全不同的技术也是可能的。
批处理文件首先将所有内容重定向到当前用户的临时文件文件夹中的临时文件。完成后,如果用户对网络文件夹没有写权限,则将临时日志文件复制到网络文件夹或附加到网络文件夹中,并禁用错误消息。
使用此技术的示例代码:
@echo off
set "LogFile=%TEMP%\%~n0.tmp"
del "%LogFile%" 2>nul
>>"%LogFile%" echo test
rem Other commands with output also redirected to log file.
if exist "%LogFile%" (
rem copy "%LogFile%" "%~dp0log.txt"
copy /B "%~dp0log.txt"+"%LogFile%" "%~dp0log.txt"
del "%LogFile%"
) >nul 2>&1
set "LogFile="
上面批次代码中注释的第一个复制命令行用新创建的日志文件覆盖批处理文件目录中的日志文件。
第二个复制命令行将新创建的日志文件附加到批处理文件目录中已经存在的日志文件中。
发布于 2017-01-13 22:49:27
重定向器重定向该数字设备之前的数字.
1
是标准输出,所以您试图将echo
输出重定向到c:\windows
--可能是受保护的,也可能是目录,而不是文件。
如果您的目的(您没有说)是重定向test 1
,那么
1>file echo test 1 2>nul
但既然你没有明确地说出你想做什么,那只是猜测。
https://stackoverflow.com/questions/41647523
复制相似问题