批处理脚本的日志文件

时间:2014-07-02 01:45:57

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

我是脚本编程的初学者,我只是制作了一个批处理脚本来在服务器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

2 个答案:

答案 0 :(得分:2)

@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 - 这可以是您选择的任何文件名。使用>>代替>附加到现有文件(如果不存在则创建它)>将替换任何现有文件。

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

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


对评论的回应:

没有关于BD的指示 - 是每个名称的一部分要在该位置构建,还是仅某些

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

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

通过一些小的调整,可以延长。

假设您想要目录名BD somethingBD OGsausages

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

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 行的目录中删除 BD 空间 ,并将dirquota短语添加到{{ 1}})

我们在文本文件中的数据变为

delims=,

只需用逗号分隔每个变量部分(选择for /f个字符。)

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

如上所述,由于J,P1,BD OG,60 J,P1,sausages,60 M,P2,XY Table,50 K,P3,BD Home,30 命令只是delims=,未执行,dirquota将为echo,因此每一行都会被报告为已成功(I'已将errorlevel添加到成功/失败的报告中。在您检查了报告的0命令行是否正确后,只需将%%c更改为dirquota,即可执行ECHO(Dirquota行;假设Dirquota是可执行文件并将dirquota设置为标准dirquota,则errorlevel行后面的0=success;otherwise failure行应正确显示结果。

答案 1 :(得分:2)

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

最后有趣的重定向导致stderr上的错误消息被重定向到与stdin相同的位置,在这种情况下是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