2016-08-03 30 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

爲什麼不只需使用'for/F'循環遍歷'server.txt'文件併爲每一行執行復制部分? – aschipfl

+0

@aschipfl你的意思是FOR/F %% G IN(server.txt)DO set/p servername = Spypsyduck

回答

1

爲什麼不使用for /F循環逐行讀取文件server.txt並在該循環內執行復制操作?我認爲這完全可以爲你工作。看看下面的例子:

@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 

複印的東西也可以放在for /F環路直接(使用%%S代替%1)內。


如果複製的東西可能會失敗,你想server.txt以包含其所有失敗的服務器名稱和serverdone.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