我试图做一个代码,它会从帮助输出的所有行中的第一个单词到变量并回显此变量。这是我的代码: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
谢谢,是的,你的权利。 –