La compréhension de démarrer, 2>nul, cmd, et d'autres symboles dans un fichier de commandes
Suite de ce sujet ici, j'essaie de comprendre ce qui se passe "derrière les coulisses", à partir d'une proposition de réponse. Je ne comprends pas ce qu'2>nul ou 1>nul n'est censé faire. Et j'ai essayé de déchiffrer ce que les symboles dans la ligne start /b est en train de faire, mais je suis vraiment paumé ici. J'ai besoin d'une approche étape par étape sur que si vous n'avez pas l'esprit.
Ce qui se passe dans cette partie du code?
2>nul del %lock%!nextProc!
%= Redirect the lock handle to the lock file. The CMD process will =%
%= maintain an exclusive lock on the lock file until the process ends. =%
start /b "" cmd /c %lockHandle%^>"%lock%!nextProc!" 2^>^&1 !cpu%%N! !cmd!
)
set "launch="
Et ce:
) 9>>"%lock%%%N"
) 2>nul
if %endCount% lss %startCount% (
1>nul 2>nul ping /n 2 ::1
goto :wait
)
2>nul del %lock%*
Copie de suggestions de code en entier:
@echo off
setlocal enableDelayedExpansion
:: Display the output of each process if the /O option is used
:: else ignore the output of each process
if /i "%~1" equ "/O" (
set "lockHandle=1"
set "showOutput=1"
) else (
set "lockHandle=1^>nul 9"
set "showOutput="
)
:: Define the maximum number of parallel processes to run.
:: Each process number can optionally be assigned to a particular server
:: and/or cpu via psexec specs (untested).
set "maxProc=8"
:: Optional - Define CPU targets in terms of PSEXEC specs
:: (everything but the command)
::
:: If a cpu is not defined for a proc, then it will be run on the local machine.
:: I haven't tested this feature, but it seems like it should work.
::
:: set cpu1=psexec \\server1 ...
:: set cpu2=psexec \\server1 ...
:: set cpu3=psexec \\server2 ...
:: etc.
:: For this demo force all cpu specs to undefined (local machine)
for /l %%N in (1 1 %maxProc%) do set "cpu%%N="
:: Get a unique base lock name for this particular instantiation.
:: Incorporate a timestamp from WMIC if possible, but don't fail if
:: WMIC not available. Also incorporate a random number.
set "lock="
for /f "skip=1 delims=-+ " %%T in ('2^>nul wmic os get localdatetime') do (
set "lock=%%T"
goto :break
)
:break
set "lock=%temp%\lock%lock%_%random%_"
:: Initialize the counters
set /a "startCount=0, endCount=0"
:: Clear any existing end flags
for /l %%N in (1 1 %maxProc%) do set "endProc%%N="
:: Launch the commands in a loop
set launch=1
echo mem=1m 2m 3m 4m 6m 8m 12m 16m 24m 32m 48m 64m 96m 128m 192m 256m 384m 512m 768m 1024m
echo o=2 3 4 5 6 7 8 10 12 14 16 20 24 28 32
echo s=off 1m 2m 4m 8m 16m 32m 64m 128m 256m 512m 1g 2g 4g 8g 16g 32g 64g on
echo x=1 3 5 7 9
for %%x IN (9) DO for %%d IN (1024m 768m 512m 384m 256m 192m 128m 96m 64m 48m 32m 24m 16m 12m 8m 6m 4m 3m 2m 1m) DO (
set "cmd=7z.exe a teste.resultado\%%xx.ppmd.%%dd.%%ww.%%ss.7z .\teste.original\* -mx=%%x -m0=PPMd:mem=%%d:o=%%w -ms=%%s"
if !startCount! lss %maxProc% (
set /a "startCount+=1, nextProc=startCount"
) else (
call :wait
)
set cmd!nextProc!=!cmd!
if defined showOutput echo -------------------------------------------------------------------------------
echo !time! - proc!nextProc!: starting !cmd!
2>nul del %lock%!nextProc!
%= Redirect the lock handle to the lock file. The CMD process will =%
%= maintain an exclusive lock on the lock file until the process ends. =%
start /b "" cmd /c %lockHandle%^>"%lock%!nextProc!" 2^>^&1 !cpu%%N! !cmd!
)
set "launch="
:wait
:: Wait for procs to finish in a loop
:: If still launching then return as soon as a proc ends
:: else wait for all procs to finish
:: redirect stderr to null to suppress any error message if redirection
:: within the loop fails.
for /l %%N in (1 1 %startCount%) do (
%= Redirect an unused file handle to the lock file. If the process is =%
%= still running then redirection will fail and the IF body will not run =%
if not defined endProc%%N if exist "%lock%%%N" (
%= Made it inside the IF body so the process must have finished =%
if defined showOutput echo ===============================================================================
echo !time! - proc%%N: finished !cmd%%N!
if defined showOutput type "%lock%%%N"
if defined launch (
set nextProc=%%N
exit /b
)
set /a "endCount+=1, endProc%%N=1"
) 9>>"%lock%%%N"
) 2>nul
if %endCount% lss %startCount% (
1>nul 2>nul ping /n 2 ::1
goto :wait
)
2>nul del %lock%*
if defined showOutput echo ===============================================================================
echo Thats all folks!
::1 ressemble à un commentaire à moi
OriginalL'auteur user2896127 | 2013-10-25
Vous devez vous connecter pour publier un commentaire.
Le chiffre avant un symbole de redirection est le nombre de flux de redirection.
Le flux par défaut est 1, si aucun numéro n'est présent, alors
1>...
et>...
sont équivalentes.le flux 1 est l'entrée standard/flux de sortie, 2 est le flux d'erreur standard.
Une commande de sortie de flux multiples et il est permis de rediriger chaque d'entre eux vers une autre destination.
Donc
2>nul
et1>nul
simplement dit que la sortie d'erreur et la sortie normal serez redirigé vers nul. Donc rien ne sera délivrée.OriginalL'auteur jeb
Mon explication:
Ligne 1: supprimer le fichier et de ne pas afficher les erreurs. de même que "del /Q". le point d'exclamation
symboles besoin delayedexpansion être activé pour évaluer quoi que ce soit. Je voudrais
ont écrit comme: del /Q "%%de verrou!nextProc!"
Ligne 2: une vraiment bizarre style de commentaires. faut juste commencer chaque ligne par "::" au lieu
Ligne 3: la même que pour la ligne 2
Ligne 4: difficile à dire sans voir le reste de script. l' %%N me dit que cette section
est à l'intérieur d'une boucle de bloc. l' ^ caractères sont nécessaires pour que la commande de démarrage
reconnaît les caractères spéciaux dans le cadre de la commande cmd chaîne. Je ne pense pas que la commande de démarrage est nécessaire
ici, à mon humble avis. Je pari que "start /B /wait" est l'équivalent de "démarrer /b", "cmd /c".
Je voudrais réécrire ce script personnellement pour le rendre plus facile à comprendre.
Aussi, à voir dostips.com
Aussi: 1>nul 2>nul ping /n 2 ::1 est l'équivalent de "ping -n 2 -w 1000 127.1 >nul" mais bêtement plus difficile à comprendre.
Également: %~1 signifie que pour obtenir le 1er arg %1 trim et citations (le cas échéant)
Je pouvais aller sur et sur, mais vous devriez juste la recherche de vous-même.
OriginalL'auteur djangofan
1>nul et 2>nul rendre donc pas de sortie est affichée.
l' ^> dans le départ, c'est donc l' > sont transmis à la commande de démarrage, pas interprété. le cmd /c lance un nouveau shell qui exécute le code après l' /c, puis se ferme.
OriginalL'auteur nephi12