重複:
説明:ループアプローチを知っていました-これはコマンド拡張機能の前でも機能しました。私は%〜* 1などの文書化されていない楽しい何かを望んでいました- http://www.Microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us /percent.mspx?mfr=true 。
Windowsバッチファイル(いわゆる「コマンド拡張機能」がオンになっている)では、%1が最初の引数、%2が2番目の引数などです。%*はすべての引数を連結したものです。
私の質問:たとえば、%2以降のすべてを取得する方法はありますか?
そんなものが見つからなかったので、今取り組んでいることの参考になります。
直接コマンドがあるかどうかはわかりませんが、常に単純なループとシフトを使用して変数の結果を取得できます。何かのようなもの:
@ echo off set RESTVAR = shift :loop1 if "%1" == "" goto after_loop set RESTVAR =%RESTVAR%%1 shift goto loop1 :after_loop echo%RESTVAR%
お役に立てば幸いです。
for
ループのトークン化機能を利用する、より短いソリューション(ワンライナー)があります。
:: all_but_first.bat
echo all: %*
for /f "tokens=1,* delims= " %%a in ("%*") do set ALL_BUT_FIRST=%%b
echo all but first: %ALL_BUT_FIRST%
出力:
> all_but_first.bat foo bar baz
all: foo bar baz
all but first: bar baz
以下は、 "、=、 ''を含む引数に対して機能します。DmitrySokolovの回答に基づいています。2番目の引数が最初の引数と同じである場合の問題を修正しました。
@echo off
echo %*
set _tail=%*
call set _tail=%%_tail:*%1=%%
echo %_tail%
以下は、"
、=
、' '
を使用した引数に対して機能します(@MaxTruxaの回答と比較して)
echo %*
set _all=%*
call set _tail=%%_all:*%2=%%
set _tail=%2%_tail%
echo %_tail%
テスト
> get_tail.cmd "first 1" --flag="other options" --verbose
"first 1" --flag="other options" --verbose
--flag="other options" --verbose
これにはSHIFTを使用できます。 %1を削除し、他のすべての引数を1つ下げます。このスクリプトは、%2の後のすべての引数を出力し(%3、%4 ...を出力します)、そのうちの1つが空になるまで(最後の引数です):
@echo off
SHIFT
SHIFT
:loop
if "%1" == "" goto end
echo %1
SHIFT
goto loop
:end
編集:これは機能しないため、%*を使用した例を削除しました-%*は常にすべてのパラメーターを出力します
セビ、これが Syntax です!動作があり、二重引用符で囲まれていない等号を一括して食べると、上記のスクリプトで問題が発生します。スキップしたくない場合は、Raman Zhylichの回答とstrlen.cmdに基づいて変更しました。
@ECHO OFF
SETLOCAL enableDelayedExpansion
SET _tail=%*
SET "_input="
SET /A _len=0
:again
SET "_param=%1"
SET "_input=%_input%%1"
FOR /L %%i in (0,1,8191) DO IF "!_param:~%%i,1!"=="" (
REM skip param
SET /A _len+=%%i
REM _len can't be use in substring
FOR /L %%j in (!_len!,1,!_len!) DO (
REM skip param separator
SET /A _len+=1
IF "!_tail:~%%j,1!"=="=" (SET "_input=%_input%=" & SHIFT & goto :again)
)
) & goto :next
:next
IF %_len% NEQ 0 SET _tail=!_tail:~%_len%!
ENDLOCAL & SET "_input=%_input%" & SET "_tail=%_tail%"
シュナーダーの答えに基づいて、%1以降のすべてを連結したい場合は、これでうまくいくと思います。
@echo off
SHIFT
set after1=
:loop
if "%1" == "" goto end
set after1=%after1% %1
SHIFT
goto loop
:end
echo %after1%