【问题标题】:Log file for batch script批处理脚本的日志文件
【发布时间】:2014-08-22 16:30:12
【问题描述】:

我是脚本初学者,我刚刚制作了一个批处理脚本来在服务器 Win2003 上创建一些配额。我想有一个日志文件作为输出,但我知道的唯一命令是 >>logfile.txt 它将为每个命令生成一个日志文件。

我想要一个 logfile.txt 来记录所有命令是否成功应用...

有人可以帮忙编码吗?

@echo off
echo.
Dirquota quota add "J:\P1\BD OG" /Limit:60GB /Type:Hard /Status:Enable /Add-Threshold:80 /Add-Notification:80,M,e-mail-warning.txt
Dirquota quota add "J:\P1\BD Chair" /Limit:60GB /Type:Hard /Status:Enable /Add-Threshold:80 /Add-Notification:80,M,e-mail-warning.txt
Dirquota quota add "M:\P2\BD Arena" /Limit:50GB /Type:Hard /Status:Enable /Add-Threshold:80 /Add-Notification:80,M,e-mail-warning.txt
Dirquota quota add "K:\P3\BD Home" /Limit:30GB /Type:Hard /Status:Enable /Add-Threshold:80 /Add-Notification:80,M,e-mail-warning.txt
echo.
pause

【问题讨论】:

  • >>logfile.txt 在每个命令之后都会起作用。如果文件已经存在,它会附加到文件中。 >logfile.txt(只有一个>)是覆盖文件(如果存在)的版本。
  • 谢谢,但问题是我有 200 多个命令 [我在这篇文章上只放了 4 个],我不想为每个命令都有一个日志文件......我想要拥有 1 个日志文件并在该文件中检查每个命令是否已成功应用......
  • 如果您使用>>logfile.txt,您将拥有一个日志文件。它不会为每个命令创建一个文件。如果您不想要该文件中所有命令的全部输出,那么这取决于dirquota 如何发出失败的信号。您必须以某种方式检查,然后使用echo Failed >> logfile.txt 或echo Success >> logfile.txt 记录结果。
  • 很棒的提示!你是对的......我需要整个输出。我在哪里把 >>logfile.txt 放在脚本上?在第一个命令的末尾?
  • 这样执行批处理文件:theBatchFile.bat > logfile.txt

标签: windows batch-file windows-server-2003-r2


【解决方案1】:
@ECHO OFF
SETLOCAL
(
 FOR /f "tokens=1-4" %%a IN (q24521687.txt) DO (
  ECHO(Dirquota quota add "%%a:\%%b\BD %%c" /Limit:%%dGB /Type:Hard /Status:Enable /Add-Threshold:80 /Add-Notification:80,M,e-mail-warning.txt
  IF ERRORLEVEL 1 (ECHO failed) ELSE (ECHO succeeded)
 )
)>newfile.txt

GOTO :EOF

此批处理例程使用一个名为 q24521687.txt 的文件,其中包含此数据(源自您的数据)

J P1 OG 60
J P1 Chair 60
M P2 Arena 50
K P3 Home 30

这可能更容易维护。

生成 newfile.txt - 这可以是您选择的任何文件名。使用>> 代替> 附加到现有文件(如果不存在则创建它)> 将替换任何现有文件。

请注意,这将只是ECHOdirquota 用于检查的命令行(到newfile.txt 文件)。删除echo( 以调用可执行文件。

我假设 dirquota 使用标准的 errorlevel 设置 - 0 表示成功,否则为非零。如果没有您指定 dirquota 的终止条件是什么,我会猜测。


对 cme​​ts 的回应:

没有迹象表明BD - 它是在该位置构造的每个名称的一部分,还是仅一些?

for /f 解析输入文件的行并将该行上的每个标记分配给%%a..%%d(%%a 被提名,标记 1-4 被选中,因此输入行上的每个标记都分配给下一个字母元变量)。

默认分隔符是 Space 和逗号等。因此,例如,J P1 OG 60 会将J 分配给%%a,将P1 分配给%%b,将OG 分配给%%c,并将60 分配给%%d。因此,dirquota 行将根据需要构造,假设(否则缺少数据)所有目录名的格式为 BD something。

通过一些小的调整,这可以扩展。

假设您想要目录名称 BD OG、sausages 和 XY Table。

由于目录名称可能包含空格,也可能不包含空格,我们可以通过稍微改变它来修复例程:

@ECHO OFF
SETLOCAL
(
 FOR /f "tokens=1-4DELIMS=," %%a IN (q24521687.txt) DO (
  ECHO(Dirquota quota add "%%a:\%%b\%%c" /Limit:%%dGB /Type:Hard /Status:Enable /Add-Threshold:80 /Add-Notification:80,M,e-mail-warning.txt
  IF ERRORLEVEL 1 (ECHO %%c failed) ELSE (ECHO %%c succeeded)
 )
)>newfile.txt

GOTO :EOF

(注意更改:从dirquota 行中的目录中删除BDSpace,并将delims=, 短语添加到for /f) p>

而我们在文本文件中的数据变成了

J,P1,BD OG,60
J,P1,sausages,60
M,P2,XY Table,50
K,P3,BD Home,30

只需用逗号分隔每个变量部分(选择delims= 字符)。

注意引号的位置。这些旨在确保正确处理分隔符。

如前所述,由于dirquota 命令只是echoed,未执行,errorlevel 将是0,因此每一行都将报告为成功(我已将%%c 添加到成功/失败的报告)。一旦您检查了所报告的dirquota 命令行是正确的,只需将ECHO(Dirquota 更改为Dirquota,dirquota 行将被执行;假设dirquota 是一个可执行文件,并且它将errorlevel 设置为标准0=success;otherwise failure,那么紧跟dirquota 行的if errorlevel 行应该正确显示结果。

【讨论】:

  • 谢谢 Magoo ,所以...我的理解是我需要将文件夹的路径放在q24521687.txt 上?我也没有设置任何error level 设置。你能告诉我把那个放在哪里吗?另外,BD 是文件夹名称的一部分,那么\BD %%c" 是必要的吗?或者只是\%%c"/Limit:%%dGB 可以解决问题?提前致谢
【解决方案2】:

正如 Aacini 在他的评论中所说,您可以在调用批处理文件时简单地重定向输出。如果您的批处理脚本名为“myScript.bat”,那么您可以使用myScript >myLog.txt 2>&1。如果要附加到现有日志文件,请使用myScript >>myLog.txt 2>&1。

最后看起来很有趣的重定向导致 stderr 上的错误消息被重定向到与 stdin 相同的位置,在这种情况下是日志文件。这是必需的,以便您可以捕获 DIRQUOTA 可能产生的任何错误消息。

这种方法存在一个问题 - 您的 PAUSE 输出也会出现在日志文件中,并且您不会在屏幕上看到按某个键的提示。您可以通过获取将输出发送到屏幕和文件的 TEE 实用程序的 Windows 端口来解决此问题。

或者,您可以如下修改您的脚本,并正常调用它:

@echo off
call :main >myLog.txt 2>&1
pause
exit /b

:main
echo.
Dirquota quota add "J:\P1\BD OG" /Limit:60GB /Type:Hard /Status:Enable /Add-Threshold:80 /Add-Notification:80,M,e-mail-warning.txt
Dirquota quota add "J:\P1\BD Chair" /Limit:60GB /Type:Hard /Status:Enable /Add-Threshold:80 /Add-Notification:80,M,e-mail-warning.txt
Dirquota quota add "M:\P2\BD Arena" /Limit:50GB /Type:Hard /Status:Enable /Add-Threshold:80 /Add-Notification:80,M,e-mail-warning.txt
Dirquota quota add "K:\P3\BD Home" /Limit:30GB /Type:Hard /Status:Enable /Add-Threshold:80 /Add-Notification:80,M,e-mail-warning.txt
echo.
exit /b

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    相关资源
    最近更新 更多