2012-08-14 80 views
1

我不認爲這是可能的,但我希望能夠做到這一點,或可能使用替代方法...是否可以在CMD中使用兩個空格作爲單個分隔符?

我有一個批處理文件;

for /f "usebackq tokens=*" %%a in (`wmic process get description, commandline`) do (
*Some Code* 
) 

我需要能夠採取從每行的兩個答案,並單獨使用它們(基本上,使用說明來檢查進程正在運行,然後我殺的過程中,做了一些後,文件清理工作,重新加載原始過程,包括任何命令行參數

輸出的過程

一個例子,我可能需要終止/重新開放可能。

"C:\some folder\some other folder\some_application" -cmd_parameter    process_name.exe 

注意, descrption明確地由多個空間定義..


那麼,有沒有說

for /f "tokens=* delims= " <--(The delims is TWO spaces, not space OR space) 

的另一種方式,可能是更好的可能是replcae多個空格的所有實例以特殊字符的方式(即一個從來沒有用在一個過程或路徑),然後用它作爲我的分數...雖然我不知道這是否甚至可能..

我也開放給任何替代方法,如只要我能得到的進程名(要檢查的過程中預先定義的列表和完整路徑exe文件,加上任何命令行paramteres給出。

感謝所有

回答

2

在直接回答你問題:不,你不能指定2個空格作爲分隔符,你可以使用SET搜索和替換來將2個空格變成一個獨特的字符,但是確定一個永遠不會出現在你的描述或命令行中的獨特字符就容易說明了。

更好的選擇是將WMIC的輸出格式更改爲LIST - 每行一個值爲。每個propery值可以存儲在一個變量中,然後當記錄進程的最後一個屬性時,可以使用變量值進行操作。 WMIC輸出使用Unicode,這會導致CarriageReturn字符被附加到每個變量賦值的末尾。 CarriageReturn必須剝離以獲得正確的結果。

@echo off 
setlocal 
for /f "tokens=1* delims==" %%A in ('"wmic process get description, commandline /format:list"') do (
    if "%%A"=="CommandLine" (
    set "cmd=%%B" 
) else if "%%A"=="Description" (
    set "desc=%%B" 
    setlocal enableDelayedExpansion 
    set "desc=!desc:~0,-1!" 
    set "cmd=!cmd:~0,-1!" 
    echo(
    echo Do whatever you need to do with the description and command line. 
    echo description=!desc! 
    echo command line=!cmd! 
    endlocal 
) 
) 

有幾件事情你需要小心。

1)對於同一個圖像名稱可以有多個進程。如果你通過圖像名稱(描述)殺死一個進程,那麼你將刪除所有這些進程。如果您還根據命令行重新啓動它,那麼當下一個具有相同名稱的進程被終止時,它將再次被終止。通過進程ID殺死進程可能會更好。 2)如果你知道進程的圖像名稱(描述),那麼你可以使用WMIC WHERE子句限制你的輸出。

3)WMIC報告的命令行並不總是可靠的。該過程能夠修改作爲命令行報告的值。

這是一個解決方案,用於檢索特定說明的進程ID和命令行。
編輯 - 我固定下面

@echo off 
setlocal 
for /f "tokens=1* delims==" %%A in ('"wmic process where description='MyApp.exe' get processId, commandline /format:list"') do (
    if "%%A"=="CommandLine" (
    set "cmd=%%B" 
) else if "%%A"=="ProcessId" (
    set "id=%%B" 
    setlocal enableDelayedExpansion 
    set "id=!id:~0,-1!" 
    set "cmd=!cmd:~0,-1!" 
    echo(
    echo Do whatever you need to do with the process id and command line. 
    echo process Id=!id! 
    echo command line=!cmd! 
    endlocal 
) 
) 

注編碼 - WMIC WHERE子句使用SQL語法。它可以使用AND和OR條件變得複雜,並且它支持使用%和_作爲通配符的LIKE運算符。我相信整個表達式在變得複雜時需要用雙引號括起來。

+0

謝謝,該部分工作...另一個問題,雖然... 我用你的代碼寫入我需要一個文本文件的過程路徑。然後我想我可以使用循環重新打開這些進程使用'開始' 當我嘗試重新打開進程,它只是打開另一個CMD窗口...我知道從測試,這是因爲雙引號,但有些路徑可能有空格,所以需要雙引號。 任何想法,我可以採取的例子; 「W:\ some folder \ someapp.exe」-some_parameter 基本上打開好像輸入到RUN命令一樣? 乾杯 – 2012-08-15 09:40:23

+0

你說過 - 「另一個問題雖然」。你的問題似乎很複雜,並且不足以保證發佈一個新問題。發佈你已經嘗試過的問題。如果它回答了您的原始問題,請不要忘記接受此答案:-) – dbenham 2012-08-15 12:13:41