0

I'm a beginner in scripting, I just made a batch script to create some quotas on a server Win2003. I would like to have a log file as an output , but the only command I know is >>logfile.txt which will make a log file for each command.

I would like to have ONE logfile.txt that will log if all commands were successfully applied or not...

Can someone help please with the coding please?

@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
4

2 回答 2

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的命令行。删除以调用可执行文件。dirquotanewfile.txtecho(

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


回复评论:

没有任何迹象表明BD- 它是在该位置构建的每个名称的一部分,还是只有一些

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

默认分隔符是Space和逗号等。因此,J P1 OG 60例如将分配J%%aP1、和。因此,将根据需要构造该行,假设(否则缺少数据)所有目录名称的形式为.%%bOG%%c60%%ddirquotaBD something

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

假设您想要directorynamesBD OG和.sausagesXY 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

(注意更改:从该行中的目录中删除BDSpacedirquota并将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编辑,而不是执行,因此每一行都errorlevel0被报告为成功(我已添加%%c到成功/失败报告中)。一旦您检查了dirquota所报告的命令行是否正确,只需更改ECHO(Dirquota为即可执行Dirquota这些dirquota行;假设dirquota是一个可执行文件并且它设置errorlevel为标准,0=success;otherwise failure那么if errorlevel直接跟随该行的dirquota行应该正确显示结果。

于 2014-07-02T02:55:50.443 回答
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
于 2014-07-02T11:17:21.213 回答