Windowsバッチファイルで%1
は、最初の引数に%2
置き換えられ、2番目の引数に%*
置き換えられ、すべての引数に置き換えられることがわかっています。
最初の引数の後にすべての引数を取得する方法はありますか?(例:引数2-N)2番目以降のすべての引数はどうですか?
コマンドはSHIFT
に影響を与えていないようです%*
。
Windowsバッチファイルで%1
は、最初の引数に%2
置き換えられ、2番目の引数に%*
置き換えられ、すべての引数に置き換えられることがわかっています。
最初の引数の後にすべての引数を取得する方法はありますか?(例:引数2-N)2番目以降のすべての引数はどうですか?
コマンドはSHIFT
に影響を与えていないようです%*
。
@ECHO OFF
SETLOCAL
CALL :allafter 3 %*
ECHO args=%args%
GOTO :eof
:allafter
FOR /l %%a IN (1,1,%1) DO SHIFT
(SET args=)
:argloop
shift
IF NOT .%1==. SET args=%args% %1&GOTO argloop
IF DEFINED args SET args=%args:~1%
GOTO :eof
の 3 番目の引数の後のすべてを取得するにはARGS
編集 - コンマを含む可能性のあるスペース区切りの要素を処理する
@ECHO OFF
SETLOCAL
CALL :allafter 3 %*
ECHO args=%args%
CALL :allafter2 3 %*
ECHO args=%args%
GOTO :eof
:allafter
FOR /l %%a IN (1,1,%1) DO SHIFT
(SET args=)
:argloop
shift
IF NOT .%1==. SET args=%args% %~1&GOTO argloop
IF DEFINED args SET args=%args:~1%
GOTO :EOF
:allafter2
SET /a count=%1
SET args=%*
:arg2loop
SET oldargs=%args%
call SET args=%%args:*%1 =%%
IF "%args%"=="%oldargs%" (call SET args=%%args:*%1,=%%) ELSE (SET /a count-=1)
shift
IF %count% gtr -1 GOTO arg2loop
GOTO :EOF
うーん- 話すのが早すぎました。この変更されたルーチンは、より適切に再生されるはずです。one,two,three
以前のバージョンでは、remove-leading-n が呼び出されたときに、1 つの引数として定義されるものを 3 つの別個の引数として扱いました。
まあ、方法っぽいものがあります...
/n
コマンドのスイッチを使用すると、そのshift
ようなことができます。ただし、すべての引数を削除し、それらを特定の変数に入れます (そのため、ループ%3
なしでは呼び出すことができなくなります)。for
@setlocal enableextensions
@echo off
:loop
if "%~2" equ "" goto end
set variable=%variable% %~2
shift /2
goto loop
:end
echo %1
echo %variable%
endlocal
パラメーターを再度分離するには、単純なfor
ループを実行するだけです (どこかでドキュメントを見つけることができると確信しています)。
shift
&なしのソリューションgoto
:
@echo off &setlocal enabledelayedexpansion
set /a count=0
for %%i in (%*) do set /a count+=1
set "args="
for /l %%i in (2,1,%count%) do if defined args (call set "args=!args! %%%%i") else call set "args=%%%%i"
echo.%args%
endlocal
> type t.bat
@echo off
echo %*
for /f "tokens=1,*delims= " %%i in ("%*") do echo %%j
> t a b c d e f,g h i
a b c d e f,g h i
b c d e f,g h i
> t a,a b c d e f,g h i
a,a b c d e f,g h i
b c d e f,g h i
>