@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
This batch routine uses a file named q24521687.txt containing this data (derived from yours)
J P1 OG 60
J P1 Chair 60
M P2 Arena 50
K P3 Home 30
Which may be easier to maintain.
Produces newfile.txt - this could be any filename you choose. Use >> in place of > to append to an existing file (or create it if it doesn't exist) > will replace any existing file.
Note that this will simply ECHO the dirquota command-line for checking (to the newfile.txt file). Delete the echo( to invoke the executable.
I've assumed that dirquota uses the standard errorlevel setting - 0 for success, non-zero otherwise. Without your specifying what the termination condition for dirquota is, I would be guessing.
Response to comments:
There's no indication about BD - is it part of every name to be constructed in that position, or only some?
The for /f parses the lines of the input file and assigns each token on the line to %%a..%%d (%%a is nominated, tokens 1-4 are selected, so each token on the input line is assigned to the next-alphabetical metavariable).
The default separators are Space and comma, amongst others. Consequently, J P1 OG 60 for example would assign J to %%a, P1 to %%b, OG to %%c and 60 to %%d. Hence, the dirquota line would be constructed as required, assuming (for lack of data otherwise) that all directorynames are of the form BD something.
With some small adjustments, this can be extended.
Suppose you wanted directorynames BD OG, sausages and XY Table.
Since the directory name may or may not contain a space, we could fix the routine by changing it a little:
@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
(note the changes : remove the BDSpace from the directory in the dirquota line and add the delims=, phrase into the for /f)
And our data in the text file becomes
J,P1,BD OG,60
J,P1,sausages,60
M,P2,XY Table,50
K,P3,BD Home,30
Simply each variable part separated by commas (the delims= character selected).
Note the positioning of the quotes. These are designed to ensure that separators are correctly processed.
As presented, since the dirquota command is simply echoed, not executed, errorlevel will be 0 so each line will be reported as having succeeded (I've added %%c to the succeeded/failed report). Once you've checked that the dirquota command-lines being reported are correct, simply change ECHO(Dirquota to Dirquota and the dirquota lines will be executed; Assuming dirquota is an executable and it sets errorlevel to the standard 0=success;otherwise failure then the if errorlevel line directly following the dirquota line should correctly display the result.
>>logfile.txtafter each command will work. It appends to the file if it exists already.>logfile.txt(only one>) is the version that overwrites the file if it exists.>>logfile.txt. It will not create one file per command. If you don't want the entire output of all commands in that file, then it depends howdirquotasignals that it failed. You'll have to check that somehow, and then log the result withecho Failed >> logfile.txtorecho Success >> logfile.txt.theBatchFile.bat > logfile.txt