2013-10-25 5 views
6

このトピックの後ろに「on here」と書かれているので、私は提案された答えから何が起こっているのかを理解しようとしています。私は2> nulや1> nulが何をするのか分かりません。そして、私は最初の/ b行のシンボルが何をしているのか解読しようとしましたが、私はここで本当に無知です。私はあなたが気にしないならば、ステップバイステップのアプローチが必要です。開始、2> nul、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=" 

そして、この:フルで推奨コードの

) 9>>"%lock%%%N" 
) 2>nul 
    if %endCount% lss %startCount% (
    1>nul 2>nul ping /n 2 ::1 
    goto :wait 
) 

2>nul del %lock%* 

コピー:リダイレクション記号の前に

@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! 
+0

:: 1は私のコメントです – djangofan

答えて

16

桁がリダイレクトするストリーム番号です。
デフォルトのストリームは1です。番号がない場合、1>...>...は等価です。

ストリーム1が標準入出力ストリーム、2が標準エラーストリームです。

コマンドは複数のストリームに出力することができ、それぞれを異なる宛先にリダイレクトすることができます。

したがって2>nul1>nulは、単にエラー出力と通常出力がnulにリダイレクトされると言っています。だから何も出力されません。

0

1> nulと2> nulは出力を表示しません。
開始の^>は開始コマンドに渡されるため、解釈されません。 cmd/cは/ cの後にコードを実行して終了する新しいシェルを開始します。

2

私の説明:

1. 2>nul del %lock%!nextProc! 
2.  %= Redirect the lock handle to the lock file. The CMD process will  =% 
3.  %= maintain an exclusive lock on the lock file until the process ends. =% 
4.  start /b "" cmd /c %lockHandle%^>"%lock%!nextProc!" 2^>^&1 !cpu%%N! !cmd! 
5. ) 
6. set "launch=" 

1行目:ファイルを削除し、エラーを表示されません。 「del/Q」と同じです。感嘆符 シンボルは、delayedexpansionを有効にして何かに評価する必要があります。私は と書いています:del/Q "%lock%!nextProc!"

2行目:本当に奇妙なコメントスタイルです。スクリプトの残りの部分を見ずに言うのは難しい:ライン2

4行と同じ:だけで「::」の代わりに

3行それぞれの行を開始する必要があります。 %% Nは、このセクション がループブロックの内側にあることを示しています。開始コマンドである がcmdコマンド文字列の一部として特殊文字を認識するように^文字が必要です。私は開始命令が必要だとは思わない ここIMHO。私は "start/B/wait"は "start/b" "cmd/c"の等号であると確信しています。 私はこのスクリプトを個人的に書き直して理解しやすくしています。また

またdostips.com参照:1> NUL 2> NULピング/ N 2 :: 1は、愚かな "ピング-n 2 -w千127.1> NUL" が、理解することは難しいのですequivilant 。また

:第一引数%1を取得し、引用符(もしあれば)をトリミングする%〜1つの手段

私は上に行く可能性がありますが、あなたはそれを自分で研究しなければなりません。

関連する問題