2016-08-03 6 views
0

に私は複数のサーバーにコピーしたファイルのバッチスクリプトを書いています。変数として.txtファイルからサーバー名を取り出し、それをサーバーに接続するために使用します。名前が変数になった後
は、私は再び実行している場合、スクリプトは次の使用可能なサーバー名を取るように、ファイルからこのエントリを削除し(別のファイルに保存)したいです。削除ラインは、バッチスクリプト

@echo off 
:start 
set /p servername=<server.txt 
findstr /v "%servername%" server.txt > serverdone.txt 

rem (Part of the script that copies the file, this is already working) 

GOTO start 

スクリプトはserver.txtの最初の行を取ることができるであると仮定として%servername%変数に代入します、しかし、findstrラインが動作していないよう:これまでのところ、私はこれを書かれている

serverdone.txtファイルは空のままであり、スクリプトはただserver.txtファイルの最初のサーバーを使用し続けます。私はこの質問をガイドとして使用しました:Delete certain lines in a txt file via a batch file

+0

なぜありません単純にファイル 'server.txt'を' for/F'ループで処理し、各行のコピー部分を実行しますか? – aschipfl

+0

@aschipflあなたはFOR/F %% G IN(server.txt)を意味します。DO set/p servername = Spypsyduck

答えて

1

なぜfor /Fループを使用して、ファイルserver.txtを1行ずつ読み込み、そのループ内の内容をコピーしますか?私はこれが完全にあなたのために働くことができると思う。次の例を見てみる:

@echo off 

rem This iterates through all lines of `server.txt`: 
for /F "usebackq delims=" %%S in ("server.txt") do (

    rem Call copying sub-routine for each item: 
    call :SUB_COPY %%S 

) 
exit /B 

:SUB_COPY 
rem (do your copying stuff here, using `%1`) 
exit /B 

複写ものはまた、(%%S代わりの%1を使用して)直接for /Fループ内に配置することができます。


場合は、それが成功しているため、それらを含むようにserverdone.txtをコピーものは失敗する可能性があり、あなたはそれが失敗したすべてのサーバー名を含むようにserver.txtをしたいと、あなたはこれを行うことができます:

@echo off 

rem This iterates through all lines of `server.txt`; 
rem `type` ensures the file to be read completely 
rem before the any further activities are pursued; 
rem `break` does nothing and is used to empty files: 
for /F "delims=" %%S in (' 
    type "server.txt" ^&^
     ^> "server.txt" break^
     ^> "serverdone.txt" break 
') do (

    rem Call copying sub-routine for each item: 
    call :SUB_COPY %%S 
    if ErrorLevel 1 (
     rem (`ErrorLevel` is `>=1`, so failure) 
     >> "server.txt" echo %%S 
    ) else (
     rem (`ErrorLevel` is `0`, so success) 
     >> "serverdone.txt" echo %%S 
    ) 

) 
exit /B 

:SUB_COPY 
rem (do your copying stuff here, using `%1`; 
rem in case of errors, set `ErrorLevel`) 
exit /B 0 & rem (success: `ErrorLevel` is `0`) 
exit /B 1 & rem (failure: `ErrorLevel` is `1`) 
+0

ありがとう、あなたは本当に私を助けました。乾杯 – Spypsyduck

関連する問題