我試圖做一個代碼,它會從幫助輸出的所有行中的第一個單詞到變量並回顯此變量。這是我的代碼:Windows CMD FOR循環
@echo off
set a=
for /F "tokens=1,*" %%i in ('help') do (
set a=%a% %%i
)
echo %a%
但它只返回最後一行的第一個單詞。爲什麼?
我試圖做一個代碼,它會從幫助輸出的所有行中的第一個單詞到變量並回顯此變量。這是我的代碼:Windows CMD FOR循環
@echo off
set a=
for /F "tokens=1,*" %%i in ('help') do (
set a=%a% %%i
)
echo %a%
但它只返回最後一行的第一個單詞。爲什麼?
您需要在您的for
循環中使用延遲擴展
@echo off
setlocal enabledelayedexpansion
set a=
for /F "tokens=1,*" %%i in ('help') do (
set a=!a! %%i
)
echo %a%
而不是使用%
圍繞a
變量,您使用!
的使用延遲擴展。
因爲回聲是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命令
試過了。並得到只有線「ECHO現在關閉」 – michaeluskov
答案更新和測試 – Steve
這將只回聲所有的話,它不會把它放在一個變量,可以再次使用。這與設置變量並使用它的結果相同,但OP可能有其他用途。 –
巴厘島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%
+1多久才能獲得第一批黃金徽章! :) –
+1,我知道它在OP的問題中,但由於只使用第一個標記,所以''tokens = 1,*「'不需要。 – dbenham
謝謝,是的,你的權利。 –