2016-08-03 166 views
2

我需要將WMIC COMPUTERSYSTEM GET MODEL/Value的值設置爲變量。當我運行這個命令時,我得到了下面的結果。爲什麼我會得到額外的空行?將變量設置爲命令的值

U:\>for /f "delims=" %i in ('WMIC COMPUTERSYSTEM GET MODEL /Value') do set output=%i 
:\>set output= 
:\>set output= 
:\>set output=Model=HP ProDesk 600 G1 SFF 
:\>set output= 
:\>set output= 
:\>set output= 
+0

@jeb,我認爲缺少的驅動器字母'U'在輸出複製和粘貼錯誤,那就是爲什麼我(重新)插入他們(急急地);控制檯上的真實輸出通常也會包含每個相鄰回波之間的空行;無論如何,我要求OP向我們展示真實的輸出...... – aschipfl

+0

@aschipfl我在編輯之前對它進行了測試,因爲我一開始也以爲他錯過了'U:>',但我錯了 – jeb

+0

啊,是的,@jeb,似乎每一行都以一個回車符和一個空格結束... – aschipfl

回答

2

這是WMIC輸出,包含carriage return字符的問題。
因此,空行不會被刪除,因爲它們不是完全空的。

回車還負責的:>代替U:>奇怪的輸出,如回車第一移動光標到POS1然後空間刪除U

有了一個額外的FOR/F您可以去除回車符

for /f "delims=" %i in ('WMIC COMPUTERSYSTEM GET MODEL /Value') do @(
    for /F "delims=" %X in ("%i") do set output=%X 
) 

順便說一句。通常你想在批處理文件中使用這樣的表達式,而不是在命令行中。
然後,你必須把它轉換爲

@echo off 
for /f "delims=" %%i in ('WMIC COMPUTERSYSTEM GET MODEL /Value') do (
    for /F "delims=" %%X in ("%%i") do set output=%%X 
) 
+0

更確切地說,我認爲問題是由於WMIC以UTF-8輸出,而內部命令期望ANSI。 SO上的許多帖子都說明了這個問題。也就是說,@ jeb的解決方案工作得很好。 – Filipus

+1

是的,你是對的,輸出是UTF-8,導致回車問題,因爲字節是'00 CR 00 LF'而不是'CR LF' – jeb

0

爲什麼我得到額外的空行?

由於WMIC打印在其輸出中的那些空行,並"FOR /F processing of a text file consists of reading the file, one line of text at a time and then breaking the line up into individual items"(重點煤礦)。

所以即使你沒有定義任何的定時器,每一行仍然是單獨處理的。

如果不需要該Model=在輸出中,你可以使用這個:

for /f "delims== tokens=2" %i in ('WMIC COMPUTERSYSTEM GET MODEL /Value') do set output=%i

+0

我試過了'do set output =%output %% i',它沒有設置我得到的值 U:\ > echo%output% %output% U:\> echo%output %% i %output %% i –

+0

@JohnRing這是另外一個問題,它沒有任何待處理的空行,你應該修改你的問題 – jeb

0

wmic命令產生的Unicode輸出,for /F有,所以不需要的人爲問題依然存在。實際上那些是孤兒回車字符。克服這個問題的最佳和最靈活的方法是嵌套另一個for /F循環,以便wmic輸出被解析兩次。

下面的命令行被直接輸入到控制檯時,各自的輸出也被示出:

U:\>for /F "delims=" %I in ('wmic ComputerSystem GET Model /VALUE') do @for /F "delims=" %L in ("%I") do set "output=%L" 

U:\>set "output=Model=HP ProDesk 600 G1 SFF" 

U:\> 

要使用上述命令行時一個批處理文件需要加倍百分號:

@echo off 
for /F "delims=" %%I in ('wmic ComputerSystem GET Model /VALUE') do (
    for /F "delims=" %%L in ("%%I") do set "output=%%L" 
) 
echo %output% 

爲了從可變output的值剝去Model=前綴,更改該腳本以這樣的:

@echo off 
for /F "tokens=1,* delims==" %%I in ('wmic ComputerSystem GET Model /VALUE') do (
    for /F "delims=" %%L in ("%%J") do set "output=%%L" 
) 
echo %output% 

的雙解析方法實際上是記dbenham - 看他的回答Why is the FOR /f loop in this batch script evaluating a blank line?也是他的外部文章WMIC and FOR /F : A fix for the trailing <CR> problem

0

正如其他人已經提到的,這個問題是由於WMIC的Unicode輸出。 在你的情況,你仍然可以把一切都在一個單一符合以下命令:

for /f "delims=" %i in ('WMIC COMPUTERSYSTEM GET MODEL /Value^|findstr /i "MODEL"') do @(set output=%i)