2014-11-20 81 views
1

敢問優化使用FOR CMD腳本批量

我有這樣的代碼:

sc query %MyService%| find /I "running"> NUL 
if not ERRORLEVEL 1 (
    for /f "delims=" %%i in ('sc query %MyService%^| find /I "running"') do (
     :: do something I 
    ) 
) else (
    for /f "delims=" %%i in ('sc query %MyService%^| find /I "running"') do (
     :: do something II 
) 

我想這樣做,沒有測試> NUL檢查錯誤級別separatly。 這可能嗎?

for /f "delims=" %%i in ('rename...') do (
    :: do something I 
) ELSE (
    :: do something II 
    echo not file(s) renamed! 
) 

我想知道是否有可能這一切使用FOR循環做的,因爲如果是修改狀態,像一些重命名命令,我沒有管理結果...... 的機會,但,如果重命名不產生結果?,我怎麼知道?

II問題 我能,獲取最後一行,最後一個「字符串的一部分」只有一個使用FOR 如果我有3行3個令牌(串)

for /f "skip=3 delims=1,tokens=3" %%i in ('My command') do (
    :: do something I 
) 

怎麼辦它?

回答

0

我會做查詢了一次,並且重用輸出:

sc query %MyService%| find /I "running"> temp.txt 
if not ERRORLEVEL 1 (
    for /f "delims=" %%i in (temp.txt) do (
     REM do something I 
    ) 
) else (
    for /f "delims=" %%i in (temp.txt) do (
     REM do something II 
) 

(雖然else似乎這裏完全無用)

注:請不要使用::一個for語句中。這可能會導致錯誤

對不起,我不太明白你的問題

0

使用缺乏從find命令結果,以決定成敗的其餘部分。如果find命令沒有找到搜索詞「running」,則不輸出任何內容,for循環將不會執行。

@echo off 
call :Foo %MyService% 
exit /b 0 

:Foo <Service> 
for /f "delims=" %%A in ('sc query "%~1" ^| find /i "running"') do (
    rem do something I 
    exit /b 0 
) 
rem do something II 
exit /b 1 



至於重命名例如,通過捕獲誤差輸出,使得在發生故障時,對於命令不執行它的代碼做同樣的事情如上述。

:Foo 
for /f "delims=" %%A in ('rename... 2^>nul') do (
    rem do something I 
    exit /b 0 
) 
rem do something II 
exit /b 1 



下面是如何獲得與標準的空白3號線第三個符號爲例定界符

set "Test=echo A B C^&echo D E F^&echo G H I" 
for /f "skip=2 tokens=3" %%A in ('%Test%') do echo %%A 
+0

:(我的測試,但不與dir命令工作 – 2014-11-20 19:43:19

+0

@chepelucho是的,這種方法只適用於一個命令的情況下,命令的輸出只用於驗證,並沒有捕獲使用。你用'dir'命令的目標是什麼?你是否嘗試過使用'dir。 ..^| find/i「成功案例搜索字詞」 – 2014-11-20 19:50:59