2013-07-10 132 views
0

我已經完成了Windows批處理文件,這已經有一段時間了,我似乎已經忘記了一切。我想要做的是尋找服務,路徑中有空格但字符串未被引用。男孩,這將是容易與bash,但...Windows批處理文件'cut'like feature

所以,簡而言之,我從sc query | findstr SERVICE_NAME開始,並將其轉儲到臨時文件。然後我將它讀回到一個帶有for /F "tokens=2" %%f in (temp_file) do set services=!services! %%f的變量中。這使我得到一個變量,其中包含我的主機上所有服務的空格分隔列表。現在,在針對該變量的FOR循環中,我運行sc qc %%s | findstr BINARY_PATH_NAME並將THAT轉儲到臨時文件。它捲起含有類似的信息(引號是我保留所有的空格):

​​

我一直在閱讀和谷歌搜索和測試亂投醫,嘗試拉閘切斷該輸出在:這樣我就可以只要結束這條路徑,然後開始搞清楚在Windows下必須是正則表達式的憎惡。但我無法獲得該字符串拆分。

+0

期望的結果是什麼? – Endoro

回答

0

像這樣的東西?如果你想與服務的名稱前綴二進制路徑

for /f "tokens=2" %%n in ('sc query ^| findstr SERVICE_NAME') do (
    for /f "delims=: tokens=1*" %%r in (
    'sc qc "%%~n" ^| findstr BINARY_PATH_NAME' 
) do (
    echo %%~s 
) 
) 

變化echo %%~secho %%~n:%%~s

@echo off 
for /f "tokens=2 delims=: " %%a in ('sc query ^| findstr SERVICE_NAME') do (
    sc qc %%a | findstr BINARY_PATH_NAME 
) 
pause 
2

,如果你想爲大家服務的二進制文件路徑,您可以執行以下操作。

+0

請注意,「for/f」在存在空格時很糟糕。你可以使用'tokens = 2 *'來匹配第二個和所有後續的標記,但是每個標記都被分配一個新的變量;在這種情況下'%n','%m'等 –

1

Ansgar Wiechers有一個很好的解決方案,使用SC獲取運行服務的信息。它還演示如何使用FOR/F分隔選項在:處打破。

另一種選擇是使用WMIC以更直接的方式獲取相同的信息。

如果你想要的是所有活動(運行)的服務二進制路徑列表,那麼所有你需要的是:

wmic service where "state='Running'" get pathname 

如果你想服務名稱的列表以及二進制路徑:

wmic service where "state='Running'" get name, pathname 

有跡象表明,可以列出很多屬性。從命令提示符鍵入wmic service get /?以獲取完整列表。

如果您想要在批處理過程中將值存入變量以便您可以採取措施,則使用FOR/F循環。我在最後添加了狀態屬性以避免奇怪的FOR/F怪異錯誤,它會將不需要的<CR>附加到WMIC輸出的每行末尾。不需要的<CR>將附加到我們不關心的狀態值。我也使用FINDSTR來清除不需要的行,所以不需要WMIC WHERE子句。在這個例子中,我簡單迴應了這些值,但顯然你可以做任何需要的值。

for /f "tokens=2,3 delims=," %%A in (
    '"wmic service get name, pathname, state /format:csv|findstr /e Running"' 
) do echo %%A: %%B