-3
@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。しかし...正しく機能せず、その理由がわかりません。お願い助けて)

4

2 に答える 2

3

%ERRORLEVEL% は解析時に展開され、括弧で囲まれたコードの FOR ブロック全体が 1 回のパスで解析されるため、コードが機能していません。反復ごとに ERRORLEVEL の値が必要ですが、コードはループが実行される前に存在していた ERRORLEVEL の値を取得しています。

1 つの解決策は、 を使用して上部で遅延展開を有効にすることsetlocal enableDelayedExpansionです。次に、ループ内で の!ERRORLEVEL!代わりに使用します%ERRORLEVEL%。遅延拡張により、各反復の実行時に ERRORLEVEL の目的の値が得られます。

コマンド ラインからhelp setorを入力して、遅延展開に関する詳細情報を取得します。set /?

しかし、変数の展開をまとめて回避する、より簡単な解決策があります。command1 && command2command1 が成功した場合にのみ command2 を実行します。||前のコマンドが成功しなかった場合にコマンドを実行するために使用する演算子もあります。

しかし、FINDSTR式では正しい結果が得られないため、演習全体は無意味であり、最終的な出力は依然として間違っています。

Ansgar Wiechers は、彼の回答で機能する検索パターンを特定しました。「tokens=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
于 2012-10-04T20:15:25.050 に答える
2

の出力からコマンドだけを抽出するには、次のhelpようなものが必要です。

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

このパターン"^[A-Z][A-Z]* "により、文字で始まり、最初の単語の後に少なくとも 2 つのスペースがある行のみを処理することが保証されます。

于 2012-10-04T18:37:58.133 に答える