@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
命令中的每个文件生成帮助文件。
但是......它无法正常工作,我不明白为什么。请帮帮我)
答案 0 :(得分:3)
您的代码无效,因为%ERRORLEVEL%在分析时展开,并且在一次传递中解析了整个带括号的FOR代码块。您希望每次迭代都有ERRORLEVEL的值,但是您的代码获得了在循环执行之前存在的ERRORLEVEL值。
一种解决方案是使用setlocal enableDelayedExpansion
在顶部启用延迟扩展。然后在您的循环中使用!ERRORLEVEL!
而不是%ERRORLEVEL%
。延迟扩展将在每次迭代的执行时间提供所需的ERRORLEVEL值。
从命令行键入help set
或set /?
以获取有关延迟扩展的详细信息。
但是有一个更简单的解决方案可以避免变量一起扩展。仅当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]* "
确保您只处理以字符开头且第一个字后面至少有两个空格的行。