2012-10-04 143 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多久才能获得第一批黄金徽章! :) –