2017-07-09 56 views
0

我想從文本文件中一次設置一行變量,使用此變量運行特定命令,然後循環,抓取第二行,處理命令等等直到文件結束。將TXT文件解析爲批處理文件

該批處理文件運行良好並要求用戶輸入,然後使用輸入作爲變量進行處理,完全沒有問題。該腳本首先獲取計算機名稱,然後複製文件安裝到本地機器上使用WMIC安裝MSI:

@echo off 
SET /P computer=Enter Computer Name 
echo. 
XCopy "\\server\netlogon\temp\*.*" "\\%computer%\c$\temp\*.*" /E /C /H /R /Y 
WMIC /Node:"%computer%" product call install true,"","c:\temp\msi_to_install.msi" 

的文本文件將是這個樣子:

PC-01 
PC-02 
PC-27 
Odd-PC 

然而,當我試圖引入一個「for」循環時,我可以一次處理一個或多個機器,但沒有任何反應。即使我在文件中只有一行,我也無法使其工作。這是我曾嘗試:

@echo off 
For /F %%i in (c:\test.txt) do (
set computer=%%i 
echo. 
XCopy "\\server\netlogon\temp\*.*" "\\%computer%\c$\temp\*.*" /E /C /H /R /Y 
WMIC /Node:"%computer%" product call install true,"","c:\temp\msi_to_install.msi" 
) 

爲了記錄我曾嘗試與變量和%%computer%%!computer!沒有成功。

我還試圖下文中也具有或不具有在「SET」命令/ P:

@echo off 
SET /P computer=<"c:\test.txt" 
echo. 
XCopy "\\server\netlogon\temp\*.*" "\\%computer%\c$\temp\*.*" /E /C /H /R /Y 
WMIC /Node:"%computer%" product call install true,"","c:\temp\msi_to_install.msi" 

我希望任何建議或輸入。

回答

1

您需要參考關於delayed expansion的部分SO文章,以獲取有關其工作原理的詳細信息。

爲了使用!var!語法(這將代替%var%工作,你的第一個for循環),你需要更早的批次(執行

​​

爲主線,而不是部分循環 - 例如,直接@echo off後或之前for環)

然而,在你的情況下,由於computer設置爲%%i,更換%computer%%%i應做一個更簡單的解決


預期結果代碼:

@echo off 
setlocal enabledelayedexpansion 
For /F %%i in (c:\test.txt) do (
set computer=%%i 
echo. 
XCopy "\\server\netlogon\temp\*.*" "\\!computer!\c$\temp\*.*" /E /C /H /R /Y 
WMIC /Node:"!computer!" product call install true,"","c:\temp\msi_to_install.msi" 
) 

@echo off 
For /F %%i in (c:\test.txt) do (
echo. 
XCopy "\\server\netlogon\temp\*.*" "\\%%i\c$\temp\*.*" /E /C /H /R /Y 
WMIC /Node:"%%i" product call install true,"","c:\temp\msi_to_install.msi" 
) 
+0

好的,謝謝你。現在我收到一個有趣的錯誤: '無效的驅動器規範' 但是,我的初始腳本示例針對我的文本文件中列出的相同機器運行正常。 – Stephen

+0

我已經從第二個腳本中刪除了多餘的'set'。你沒有指出你正在使用哪個腳本,也不知道這個錯誤是否出現在'test.txt'的* some *或* all *數據行上。我會將'xcopy'更改爲'echo xcopy'和'wmic'以'echo wmic'並查看是否報告了預期的指令 - 如果沒有,是否有任何失敗有共同之處? – Magoo

+0

這兩個例子都被使用了,我不再因爲我無意中刪除了一行而出錯。當我現在執行此操作時,根本沒有任何反應,我在一秒鐘內回覆提示,完全沒有錯誤信息。我真的難住這一個。 – Stephen

0

格式輸入文件並將其保存在ANSI格式之後,這是工作的最終代碼:

@echo off 
setlocal enabledelayedexpansion 
For /F %%i in (c:\computers.txt) do (
set computer=%%i 
echo. 
XCopy "\\server\netlogon\temp\msifolder\*.*" "\\!computer!\c$\temp\msifolder\*.*" /E /C /H /R /Y 
WMIC /Node:"!computer!" product call install true,"","c:\temp\msi_to_install.msi" 
RD /S /Q "\\!computer!\c$\temp\msifolder\" 
) 

在腳本的最終版本中,我複製MSI文件在本地的文件夾,安裝MSI,然後在完成後刪除文件夾。如果已經安裝了MSI,你會得到這個錯誤:

instance of __PARAMETERS 
{ 
ReturnValue = 1603 

對於一個成功的安裝,你會得到一個ReturnValue = 0

@magoo提供故障排除了很多方向,謝謝,文件格式爲拼圖的最後一塊。