cmd,程序生成帮助文件

时间:2012-10-04 17:02:35

标签: cmd

@echo off
md helpgen 2>nul
cd helpgen
for /F %%i in ('help') do (
  echo %%i|findstr /R "^[A-Z]*$" >nul
  if "%ERRORLEVEL%"=="0" (
    help %%i>%%i.txt
  ) 
)
cd ..

该程序应该为help命令中的每个文件生成帮助文件。 但是......它无法正常工作,我不明白为什么。请帮帮我)

2 个答案:

答案 0 :(得分:3)

您的代码无效,因为%ERRORLEVEL%在分析时展开,并且在一次传递中解析了整个带括号的FOR代码块。您希望每次迭代都有ERRORLEVEL的值,但是您的代码获得了在循环执行之前存在的ERRORLEVEL值。

一种解决方案是使用setlocal enableDelayedExpansion在顶部启用延迟扩展。然后在您的循环中使用!ERRORLEVEL!而不是%ERRORLEVEL%。延迟扩展将在每次迭代的执行时间提供所需的ERRORLEVEL值。

从命令行键入help setset /?以获取有关延迟扩展的详细信息。

但是有一个更简单的解决方案可以避免变量一起扩展。仅当command1成功时,command1 && command2才会执行command2。如果先前命令不成功,还有||运算符用于执行命令。

但是整个练习有点没用,因为你的FINDSTR表达式不能给出正确的结果,所以你的最终输出仍然是错误的。

Ansgar Wiechers确定了一种适用于his answer的搜索模式。不需要“令牌= 1”,因为这是默认设置。

最终脚本可以简单如下:

@echo off
md helpgen 2>nul
cd helpgen
for /f %%i in ('help ^| findstr /rc:"^[A-Z][A-Z]*  "') do help %%i>%%i.txt

答案 1 :(得分:2)

要从help的输出中仅提取命令,您需要这样的内容:

for /f "tokens=1" %%i in ('help ^| findstr /rc:"^[A-Z][A-Z]*  "') do (
  echo %%i
)

模式"^[A-Z][A-Z]* "确保您只处理以字符开头且第一个字后面至少有两个空格的行。