2013-02-14 108 views
4

您好,我試圖在批處理文件中使用FOR /F命令,但我遇到了問題。刪除/ F結尾處的空格

我運行它....

rem finding model number 
for /F "delims= skip=1 tokens=*" %%a in ('wmic csproduct get name') do if not defined model set model=%%a 

和它工作得很好,我得到的結果,我想

result: 637263G 

現在可以說,我創建一個名爲 「637263G」 下的文件夾C: \ WINDOWS \

eg:c:\windows\637263G\test 

和我創建一個批處理去路徑...

for /F "skip=1 tokens=*" %%a in ('wmic csproduct get name') do if not defined model set model=%%a 

cd windows\%model%\test 

................................

這個炸彈,因爲該模型%是%返回"c:\windows\637263G \test"而不是"c:\windows\637263G\test"

它將在型號名稱後留出空格。

有誰知道如何去掉後面的空間?

回答

3

您可以通過使用替代抑制%%一個所有空間:

set a=%a: =% 
+0

對於_normal_變量,正確的語法是'set a =%a:=%',刪除前導'%%'。對於參數代替不起作用 – jeb 2013-02-14 13:36:29

+0

@jeb感謝您的擡頭,您可以編輯我的答案;) – 2013-02-14 13:57:13

+1

有些計算機在值的中間有空格,所以這不是一個好的選擇。 – dbenham 2013-02-15 03:51:01

1

像Kayasax建議,你可以使用變量替換。
但這隻適用於正常的變量,不適用於%1,也不適用於循環參數。

set "model=%model: =%" 

或者,如果你確信WMIC始終添加一個空格,你也可以使用

set "model=%model:~0,-1%" 

這從微調返回字符串只刪除最後一個字符

+0

有些值在中間有空格,所以第一個選項就沒有了。我的機器最後有2個空格。我不知道這是否是恆定的,所以第二種選擇也可能是有問題的。此外,問題還由尾隨''問題加劇。 – dbenham 2013-02-15 03:49:57

2

除了(如已經建議)您還可以重新格式化Wmic輸出,以便它不返回填充(空格),例如:

for /f "skip=2 tokens=2 delims=," %%a in ('wmic csproduct get name /format:csv')

如果您想要返回多於1列,它尤其方便。
(它將返回的數據,因爲它是,所以如果它包括了尾部的空格,它將會被保留。如果你要無條件地修剪空間,使用變量替換)

+0

+1,但我需要SKIP = 2而不是1.我也有一個問題與不需要的''。 – dbenham 2013-02-15 01:22:26

+0

@dbenham你對跳過,我的壞是正確的。我從OP複製並忘記更新。更正了,謝謝!至於'CR',在我的(xp)筆記本電腦上,這個問題首先顯示(標題行,'名稱'後面跟着'CR'),但沒有值行。也許操作系統的差異。 – wmz 2013-02-15 09:00:29

+0

我認爲它在那裏,但你可能不會看到它,這取決於你如何訪問變量。看[我的回答](http://stackoverflow.com/a/14887005/1012053) – dbenham 2013-02-15 11:03:49

3

你不應該刪除所有空格,如一些答案建議,因爲有些計算機在值的中間有空格。見List of WMIC CSProduct Get Name Results

我不僅得到了多個尾隨空格,還收到了一個尾隨的回車符(<CR>),它是將WMIC的unicode輸出自動轉換爲ASCII的工件。

尾隨的<CR>可以通過將值通過另一個FOR/F循環來移除。這也刪除了幻影「空白」行(實際上是<CR>),所以不再需要IF語句。

可以使用~nx修飾符刪除尾部空格。這是有效的,因爲文件名不能以空格或點結束,並且被操作系統自動刪除。修飾符通過去除尾隨點和空格來標準化「文件名」。如果值包含\,/,*?,或者如果它以字母開頭並且後跟:,則這將無法正常工作。

for /F "skip=1 delims=" %%A in (
    'wmic csproduct get name' 
) do for /f "delims=" %%B in ("%%A") do set "model=%%~nxB" 

另一種選擇是使用CSV格式的WMZ的建議,但我還是要刪除尾隨<CR>

for /F "skip=2 tokens=2 delims=," %%A in (
    'wmic csproduct get name /format:csv' 
) do for /f "delims=" %%B in ("%%A") do set "model=%%B" 


編輯 - 爲什麼WMZ解決可能出現的工作,不剝<CR>

<CR>問題可能並不明顯,這取決於它的設置後,你如何訪問model變量。正常擴展將剝離任何<CR>,但延遲擴展保留它。

@echo off 
setlocal enableDelayedExpansion 
for /f "skip=2 tokens=2 delims=," %%A in (
    'wmic csproduct get name /format:csv' 
) do set "model=%%A" 
echo Normal expansion strips ^<CR^>:  [%model%] 
echo Delayed expansion preserves ^<CR^>: [!model!] 

---輸出---

Normal expansion strips <CR>:  [LX4710-01] 
] Delayed expansion preserves <CR>: [LX4710-01 


編輯 - 另一種方式來避免<CR>問題

您可以使用CSV格式,並要求出現一個額外的屬性在你想要的價值之後。當您解析出所需的令牌時,<CR>將與額外值一起被丟棄。

for /f "skip=2 tokens=2 delims=," %%A in (
    'wmic csproduct get name^,vendor /format:csv' 
) do set "model=%%A"