2012-10-04 141 views
0

我試圖做一個代碼,它會從幫助輸出的所有行中的第一個單詞到變量並回顯此變量。這是我的代碼:Windows CMD FOR循環

@echo off 
set a= 
for /F "tokens=1,*" %%i in ('help') do (
set a=%a% %%i 
) 
echo %a% 

但它只返回最後一行的第一個單詞。爲什麼?

回答

2

您需要在您的for循環中使用延遲擴展

@echo off 
setlocal enabledelayedexpansion 
set a= 
for /F "tokens=1,*" %%i in ('help') do (
set a=!a! %%i 
) 
echo %a% 

而不是使用%圍繞a變量,您使用!的使用延遲擴展。

+0

+1,我知道它在OP的問題中,但由於只使用第一個標記,所以''tokens = 1,*「'不需要。 – dbenham

+0

謝謝,是的,你的權利。 –

1

因爲回聲是DO(......)

@echo off 
for /F "tokens=1,*" %%i in ('help') do (
echo %%i 
) 

,無需打印之外,你可以直接使用%%我。
另一個非常簡單的例子可能是這樣就節省了一批如help1.cmd

@echo off 
for /F "tokens=1,*" %%i in ('help') do (
if /I "%%i" EQU "%1" echo %%j 
) 

,並調用此批像

help1 MKDIR 

獲得短幫助文本mkdir命令

+0

試過了。並得到只有線「ECHO現在關閉」 – michaeluskov

+0

答案更新和測試 – Steve

+0

這將只回聲所有的話,它不會把它放在一個變量,可以再次使用。這與設置變量並使用它的結果相同,但OP可能有其他用途。 –

3

巴厘島C解決了你所說的問題,但它看起來像我正在嘗試獲取HELP中找到的命令列表。

有些命令出現在多行上,所以你會得到一些無關的詞。另外還有一個以英文機器上的「For」開始的前後行,這是不需要的。

這是一個英文機器的簡短腳本,它將構建命令列表。 FINDSTR命令將不得不針對不同的語言進行更改。

@echo off 
setlocal enableDelayedExpansion 
set "cmds=" 
for /f "eol= delims=." %%A in ('help^|findstr /bv "For"') do (
    for /f %%B in ("%%A") do set "cmds=!cmds! %%B" 
) 
set "cmds=%cmds:~1%" 
echo %cmds% 


編輯

安斯加爾Wiechers想出了一個更高效的算法來提取只是在https://stackoverflow.com/a/12733642/1012053命令的名字,我相信應該與所有語言。我用他的想法來簡化下面的代碼。

@echo off 
setlocal enableDelayedExpansion 
set "cmds=" 
for /f %%A in ('help^|findstr /brc:"[A-Z][A-Z]* "') do set "cmds=!cmds! %%A" 
set "cmds=%cmds:~1%" 
echo %cmds% 
+0

+1多久才能獲得第一批黃金徽章! :) –