2017-06-13 23 views
0

想要檢測程序是否在VirtualBox中運行。WMIC批量輸出。如何清除腐敗?

@echo off 
setlocal enabledelayedexpansion 
set count=0 
for /f "tokens=1 delims==" %%a in ('wmic csproduct get name') do (
    set name!count!=%%a 
    set /a count=!count!+1 
) 
if /i not !name1!==virtualbox (
echo NOT VIRTUALBOX 
echo !name1! 
) else (
echo VIRTUALBOX 
echo !name1! 
) 
endlocal 

!name1!字符串已損壞。通過在echo !name1!之後添加文本,變量!name1!被添加的文本吃掉,文本出現在BEFORE字符串之前。無法執行if與此類字符串進行比較。有什麼建議麼?

回答

3

線上纏繞另一for /F循環:

... 
for /F "delims=" %%a in ('wmic CSProduct get Name') do (
    for /F "tokens=1 delims==" %%b in ("%%a") do (
     set "name!count!=%%b" 
     set /A count+=1 
    ) 
) 
... 

的問題是,wmic產生的Unicode輸出,for /F不能正確轉換爲ANSI文本,它留下一些文物(孤兒回車字符)的背後;第二個for /F循環刪除它們。


命令行wmic CSProduct get Name產生等的輸出:

Name 
VirtualBox 

因此你可以在skip=1選項添加到外for /F循環不處理的報頭。此外,內for /F循環的選項字符串tokens=1 delims==沒有意義的,因爲不能再出現任何=反正:

... 
for /F "skip=1 delims=" %%a in ('wmic CSProduct get Name') do (
    for /F "delims=" %%b in ("%%a") do (
     set "name!count!=%%b" 
     set /A count+=1 
    ) 
) 
... 

或者,你可以在/VALUE選項添加到wmic命令行獲得一個輸出像這樣:

Name=VirtualBox 

在這種情況下,需要適應這樣的代碼:

... 
for /F "delims=" %%a in ('wmic CSProduct get Name /VALUE') do (
    for /F "tokens=1* delims==" %%b in ("%%a") do (
     set "name!count!=%%c" 
     set /A count+=1 
    ) 
) 
... 
+0

謝謝。這消除了「隱藏的腐敗」,但仍然留下了一些垃圾。如果有其他人應該與此鬥爭,「echo +!myvariable!+」看看「+!myvariable!+」之間有多少空白,並使用所描述的字符移除技術在[ss64.com](https://ss64.com/nt/syntax-substring.html) –