我是脚本编程的初学者,我只是制作了一个批处理脚本来在服务器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
答案 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
分配给%%a
,P1
分配给%%b
,OG
分配给%%c
和{{1}到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
行的目录中删除 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