首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在某些用户将文本重定向到受写入保护的文件时,禁止错误消息“拒绝权限”输出?

如何在某些用户将文本重定向到受写入保护的文件时,禁止错误消息“拒绝权限”输出?
EN

Stack Overflow用户
提问于 2017-01-13 22:44:59
回答 3查看 1.4K关注 0票数 0

我有一个问题,我的批处理在一个网络驱动器上,并不是所有的人都有这个路径的写权限。通常,批处理也会记录一些信息。

我想在没有写许可的情况下取消permission denied信息。我的假设是,我必须将标准错误重定向到nul

但这个例子行不通。我会得到一个permission denied。如果没有创建日志,也可以,但我不想看到permission denied错误消息。此错误消息应重定向到stderr

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo test 1> c:\Windows\log.txt 2> nul
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-01-14 01:16:39

如果您使用的语法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo data >log.txt 2>nul 

您请求将echo命令生成的输出发送到日志文件,并将该命令生成的错误发送到nul。

您的问题是,对stderr的输出不是由执行echo命令生成的,而是由于重定向处理在echo本身之前执行的芦丁失败而产生的。

您需要将stderr重定向操作向上移动一个级别。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2>nul ( >log.txt echo data )

现在,stderr重定向封装了括号内的所有内容,即重定向操作和echo执行。

票数 2
EN

Stack Overflow用户

发布于 2017-01-14 01:35:42

命令行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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时取消的错误输出,这需要不同的语法。

你可以用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(>"%SystemRoot%\log.txt" echo test) 2>nul

或更容易阅读:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@echo off
(
    >"%SystemRoot%\log.txt" echo test
) 2>nul

回显命令行包含在一个命令块中,从开始的圆括号(开始,以匹配的结束括号)结尾。此命令块中任何用于处理STDERR的命令输出的所有内容都被重定向到device NUL,如果当前用户没有在输出目录中创建文件log.txt的权限,或者输出文件已经存在并具有只读属性集,或者如果输出文件当前由一个应用程序打开,该应用程序使用其他应用程序的文件共享写锁打开该文件,则该将包含cmd输出的错误消息。

重定向操作符>和文件名在回显命令行中指定,以便在开始时能够输出数字为1 . 9的文本,而无需将尾随空格写入文件%SystemRoot%\log.txt

由于命令块在回显命令行周围使用,ECHO结束圆括号)的输出现在需要用插入字符^转义该字符,如下面的示例所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@echo off
(
    >"%SystemRoot%\log.txt" echo '(' and '^)' are round brackets/parentheses.
) 2>nul

另一种较慢的替代解决方案是使用延迟扩展:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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的文章使用命令重定向运算符

使用完全不同的技术也是可能的。

批处理文件首先将所有内容重定向到当前用户的临时文件文件夹中的临时文件。完成后,如果用户对网络文件夹没有写权限,则将临时日志文件复制到网络文件夹或附加到网络文件夹中,并禁用错误消息。

使用此技术的示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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="

上面批次代码中注释的第一个复制命令行用新创建的日志文件覆盖批处理文件目录中的日志文件。

第二个复制命令行将新创建的日志文件附加到批处理文件目录中已经存在的日志文件中。

票数 1
EN

Stack Overflow用户

发布于 2017-01-13 22:49:27

重定向器重定向该数字设备之前的数字.

1是标准输出,所以您试图将echo输出重定向到c:\windows --可能是受保护的,也可能是目录,而不是文件。

如果您的目的(您没有说)是重定向test 1,那么

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1>file echo test 1 2>nul

但既然你没有明确地说出你想做什么,那只是猜测。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41647523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文