2012-02-27 40 views
1

所以嘗試一下本作循環在你的Windows中ICACLS就給處理失敗的錯誤在DOS for循環

for /f "tokens=1,2 delims==" %a in ('wmic service list full^|find /i "pathname"^|find /i /v "system32"') do dir %b

這只是正常的我,但是當我使用icacls命令dir而不是我得到一個錯誤上面寫着ICACLS無法處理

for /f "tokens=1,2 delims==" %a in ('wmic service list full^|find /i "pathname"^|find /i /v "system32"') do icacls %b

如果我在它只是罰款一次運行鍼對任何一個輸出的ICACLS

icacls c:\windows\ehome\ehrecvr.exe

我也呼應命令只是爲了確保一切看起來都沒什麼問題,它

for /f "tokens=1,2 delims==" %a in ('wmic service list full^|find /i "pathname"^|find /i /v "system32"') do @echo icacls %b

什麼建議嗎?

回答

1

對於我的生活,我無法弄清楚爲什麼失敗。但使用do call icacls %b似乎解決了這個問題。

但服務選項包含在%b中,並且它們導致icacls失敗,因爲它們是icacls的無效選項。

最簡單的解決方案似乎是切換到調用子例程的批處理文件。不需要的選項僅通過處理%1而被剝離。

爲了安全起見,最好使用"tokens=1*"以防"出現在任何路徑中。

@echo off 
for /f "tokens=1* delims==" %%a in ('wmic service list full^|find /i "pathname="^|find /i /v "system32"') do call :doit %%b 
exit /b 

:doit 
icacls %1 
+0

您沒有閱讀過Ed的文章! [wmic corrupted stdout](http://www.dostips.com/forum/viewtopic.php?f=3&t=2927)。 'wmic'在最後附加一個回車符,而你的'CALL'將其刪除 – jeb 2012-02-28 10:39:22

+0

dbenham, 感謝您的反饋。我想不出爲什麼這會失敗,但調用「do call icacls%b」,或者我可以從朋友那裏「執行cmd.exe/c icacls%b」。我的朋友建議輸出到帶有「for/f」標記= 2 delims ='='「%a的文本文件('wmic service list full^| find/i」路徑名「^ | find/i/v」system32「')執行@echo%a >> c:\ windows \ temp \ calcs.txt」然後用這行解析該輸出「for/fol e = ^」^ delims (c:\ windows \ temp \ calcs.txt)中執行cmd.exe/c cacls「%a」「^ = ^」%a。所以希望能幫助別人。 – teedubb 2012-02-28 18:39:13