2

わかりました、これで遊んでいますが、各パラメーターに対してコマンドを実行することはできません。

として実行されるバッチファイル

test.bat /r /a /c

完全なバッチ コード

@echo on
SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION

:checkloop
set argtoken=1
FOR /F "Tokens=* delims=" %%G IN ("%*") DO (call :argcheck %%G)
pause
GOTO:END


:argcheck
if /i "%1"=="/r" set windows=1
if /i "%1"=="/a" set active=1
goto:eof

:end

"%*" などのすべての引数を表示します。

/r /a /c

しかし、なんらかの理由で、for ループをさまざまなパラメーターに分割して各パラメーターに対して実行することはできません:argcheck

更新:ここに興味がある人は、私が最終的に得たものです。私はそれをいくつかの異なるスクリプトで実装していますが、その動作は驚くべきものです。call 関数と "%*" を使用してスクリプトのどこかに配置するだけで問題ありません。:) 問題があれば投稿してください。

@echo off
SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION

call:ArgumentCheck %*
echo %DebugMode%
echo %RestartAfterInstall%
pause
goto:eof

:ArgumentCheck
if "%~1" NEQ "" (
    if /i "%1"=="/r" SET DebugMode=Yes & GOTO:ArgumentCheck_Shift
    if /i "%1"=="/a" SET RestartAfterInstall=Yes & GOTO:ArgumentCheck_Shift
    SET ArgumentCheck_Help=Yes
    :ArgumentCheck_Shift
        SHIFT
        goto :ArgumentCheck
)
If "%ArgumentCheck_Help%"=="Yes" (
    Echo An invalid argument has been passed, currently this script only supports
    ECHO /r /a arguments. The script will continue with the arguments 
    ECHO you passed that is supported.
)
GOTO:EOF
:end
4

1 に答える 1

10

原因は、FOR/F が 1 行を %%A、%%B、%%... という名前の固定数のトークンに分割することです (%%A は最初の名前付きトークンです)。
しかし、空を使用するdelims=と、これでも機能しません。

FOR /F "tokens=1-5 delims= " %%A in ("%*") do (
  echo %%A, %%B, %%C, %%D, %%E
)

これは行をトークンに分割しますが、トークンを次のように分割することさえあります

One "two and three"

出力:

One, "two, and, three",

使いやすくSHIFT、ループします。

:loop
if "%~1" NEQ "" (
  call :argcheck
  SHIFT
  goto :loop
)
于 2012-06-22T09:37:37.410 に答える