2016-08-28 1 views
-3

私はバッチファイルを使ってテキストファイルにレコードを書き込みます。このレコードのそれぞれをファイルから処理する必要があります。たとえば、Name == KDの場合は、手順1に進みます。次の手順に進みます。gotoステップの後にバッチスクリプトがファイルの残りの部分を処理していません

問題は手順1に進み、ファイルを終了します。 DFで処理を続行するには、次のレコードに戻る必要があります。私は戻ってくるセクションにラベルを追加しましたが、処理を続けるのはKDです。

テキストファイルの例:

Line Name Container 
1 KD 123 
2 DF 657 

コード:

set txtfilepath=C:\Temp\Test.txt 
set /a cnt=0 
for /f %%a in ('type "%txtfilepath%"^|find "" /v /c') do set /a cnt=%%a 
echo %txtfilepath% has %cnt% lines 

for /f "skip=1 tokens=1,2,3,4,5* delims=,] " %%a in ('find /v /n "" ^< %txtfilepath%') do (

    echo.%%b - this displays variable fine. 
    if %%b==DF (
     set result=true 
    ) else (
     goto donotexecute 
    ) 
    echo I am in true loop. 

    :donotexecute 
    echo i am in do not import loop 

) 
:Done 

ので、コードがdonotexecuteラベルに行き、その後、私は継続するループのための私の最初に戻ってする方法がありませんテキストファイルの次の行。

+4

バッチファイルのサンプルを含めると、少なくともあなたが話しているOSを理解することができ、おそらくあなたの質問が理解できるかもしれません。 – FDavidov

+0

ご回答いただきありがとうございます。いつかコードを書式設定しました。申し訳ありません編集...だからコードはdonotexecuteラベルに入って、私はtxtファイルの次の行を続ける私の初期のループに戻る方法がありません – user3438791

+0

'goto'を使用しないでくださいすべての囲みループの – DavidPostill

答えて

1

まず、環境変数に値を割り当てたい場合は、set /a(算術式の評価)を使用しないでください。

環境変数は常にstring型です。算術式では、直接指定された、または環境変数が保持する各数値は、式の評価のために一時的に32ビットの符号付き整数に変換され、整数結果は最終的に指定された環境変数に格納された文字列に変換されます。非常に速いのは、数値文字列を環境変数に直接割り当てることです。

第2に、Windowsコマンドプロセッサはループ内のラベルをサポートしていません。サブルーチンを使う必要があります。使用するコマンドを理解し、どのように彼らは、コマンドプロンプトウィンドウを開き、そこに次のコマンドを実行し、完全にページが非常に慎重に、各コマンドのために表示されているすべてのヘルプを読んで、仕事のため

@echo off 
set "txtfilepath=C:\Temp\Test.txt" 

rem Don't know why the number of lines in the files must be determined first? 
set "cnt=0" 
for /F %%a in ('type "%txtfilepath%" ^| %SystemRoot%\System32\find.exe "" /v /c') do set "cnt=%%a" 
echo %txtfilepath% has %cnt% lines. 

for /F "usebackq skip=1 tokens=1-5* delims=,] " %%a in ("%txtfilepath%") do (
    if "%%b" == "DF" (
     call :ProcessDF "%%c" 
    ) else if "%%b" == "KD" (
     call :ProcessKD "%%c" 
    ) 
) 

echo Result is: %result% 

rem Exit processing of this batch file. This command is required because 
rem otherwise the batch processing would continue unwanted on subroutine. 
goto :EOF 


rem This is the subroutine for name DF. 

:ProcessDF 
echo Processing DF ... 
set "result=true" 
echo Container is: %~1 
goto :EOF 

rem The command above exits subroutine and batch processing continues 
rem on next line below the command line which called this subroutine. 


rem This is the subroutine for name KD. 

:ProcessKD 
echo Processing KD ... 
echo Container is: %~1 
rem Other commands to process. 
goto :EOF 

  • call /?
  • echo /?
  • find /?
  • for /?
  • goto /?
  • if /?
  • rem /?
  • これはまったく同じであるとしてgoto :EOFが使用されている。ここで、0
  • type /?

exit /Bもどこでも使用することができます。詳細については、コマンドプロンプトウィンドウexit /?で実行してください。大きなバッチファイルの場合は、例えばexit /Bを使用してバッチファイルの処理を終了する場合に使用し、goto :EOFを使用してサブルーチンを終了するだけで使用するのが理にかなっています。

+0

を参照してくださいありがとうございました..私はプロセスを実行するにはどのくらいの時間を理解するためにラインの数を数えています。また、どのようにしてサブルーチン内で変数を使用することができますか?私のProcessDFルーチンで%% bを使用する方法 – user3438791

+0

デモコードは、メインループからサブルーチンへの引数として1つ以上のループ変数を渡す方法を示します。 '%1'、'%2'などでアクセスしてください。 'call'コマンドのヘルプを参照してください。もちろん、ループ変数の文字列を最初に環境変数に代入し、サブルーチンを呼び出してサブルーチンで環境変数を使用することもできます。 – Mofi

関連する問題