2017-03-02 68 views
0

最終能夠將以下工作放在一起,但有一個額外的路線。批量取得盛大母公司的WMIC

For /f "tokens=1,2 skip=1 delims=\" %%i IN (
    'WMIC service WHERE "name LIKE 'tomcat%%'" GET PathName' 
) DO (
echo %%i\%%j 
) 
Pause 

運行時,我們看到:

  • d:\ tomcat的
  • d:\ tomcat2
  • \

和\是不正確的。

+0

我會推薦PowerShell而不是批處理(一行):'gwmi Win32_Service -Filter「Name LIKE'tomcat%'」| %{$ _ PathName}' –

回答

1

圍繞另一個for /F環裹擺脫Unicode到ANSI文本轉換人爲因素(如孤兒回車字符)留下的for /F

for /F "skip=1 delims=" %%a in (' 
    wmic Service where "Name LIKE 'tomcat%%'" get PathName 
') do (
    for /F "tokens=1,2 delims=\" %%i in ("%%a") do (
     echo %%i\%%j 
    ) 
) 

外環讀取除了你想要跳過的行之外的完整行;內部的人解析文本。

+0

我喜歡這個答案最好,因爲它涵蓋了需要什麼,如果我們玩腳本高爾夫,我認爲這是贏家!我很欣賞這個問題的所有投入。 – Leptonator

0

如果您想批量執行此操作,則可以使用此語法。這只是給你父母和祖父母文件夾。如果您需要完整的路徑,請將dp修飾符添加到FOR變量中。

@echo off 
For /f "skip=1 delims=" %%G IN ('WMIC service WHERE "name LIKE 'wdpostman'" GET PathName ^|findstr /r /V "^$"') DO (
    for %%H in ("%%~dpG\.") do set "parent=%%~nxH" 
    for %%H in ("%%~dpG\..") do set "gparent=%%~nxH" 
) 
echo parent=%parent% 
echo gparent=%gparent% 

只是想添加這組額外的代碼,告訴你如何將文件夾路徑分解成變量。

@echo off 
setlocal enabledelayedexpansion 
For /f "skip=1 delims=" %%G IN ('WMIC service WHERE "name LIKE 'wdpostman'" GET PathName ^|findstr /r /V "^$"') DO (
    set "_fpath=%%~dpG" 
) 
set "_fpath=%_fpath:~0,-1%" 
set i=1 
set "_spath!i!=%_fpath:\=" & set /A i+=1 & set "_spath!i!=%" 
echo There %i% Folder(s^) 
set _spath 

Pause 
+0

我收到以下內容:'批處理參數 替換中的路徑運算符的以下用法無效:%〜dpG \ ..' – Leptonator

+0

對不起。我錯過了兩倍的%。 – Squashman

+0

不完全..我只是指着:http://stackoverflow.com/questions/15685816/how-can-i-remove-empty-lines-from-wmic-output從我的一個同事..發佈現在的解決方案。 – Leptonator

0

我的一個在我的同事向我指出:

How can I remove empty lines from wmic output? - 更具體地說:https://stackoverflow.com/a/15686239/175063

For /f "tokens=1,2 skip=1 delims=\" %%i IN (
    'WMIC service WHERE "name LIKE 'tomcat%%'" GET PathName ^| findstr /r /v "^$"' 
) DO (
echo %%i\%%j 
) 
Pause 

我知道這是不是因爲@ Squashman的解決方案爲優雅,但這種是我正在尋找或至少類似。

+0

所以真的這應該被標記爲重複的問題? – Squashman

0

這是我的經驗,PathName實際返回其他行。當我說我的意思是在WMIC命令通常的「奇怪」輸出之上。爲了確保你的輸出不受影響,我會使用Call來解決它。

@Echo Off 
For /F "Skip=1 Delims=" %%A In (
    '"WMIC Service Where (Name Like 'tomcat%%') Get PathName"' 
) Do Call :Sub %%A 
Timeout -1 
GoTo :EOF 

:Sub 
If Not "%~1"=="" Echo(%*