web-dev-qa-db-ja.com

バッチパラメータ:%1以降

重複:

説明:ループアプローチを知っていました-これはコマンド拡張機能の前でも機能しました。私は%〜* 1などの文書化されていない楽しい何かを望んでいました- http://www.Microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us /percent.mspx?mfr=true


Windowsバッチファイル(いわゆる「コマンド拡張機能」がオンになっている)では、%1が最初の引数、%2が2番目の引数などです。%*はすべての引数を連結したものです。

私の質問:たとえば、%2以降のすべてを取得する方法はありますか?

そんなものが見つからなかったので、今取り組んでいることの参考になります。

35
noamtm

直接コマンドがあるかどうかはわかりませんが、常に単純なループとシフトを使用して変数の結果を取得できます。何かのようなもの:

 @ echo off 
 set RESTVAR = 
 shift 
:loop1 
 if "%1" == "" goto after_loop 
 set RESTVAR =%RESTVAR%%1 
 shift 
 goto loop1 
 
:after_loop 
 echo%RESTVAR%
 

お役に立てば幸いです。

21
Samuel

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
33
Max Truxa

以下は、 "、=、 ''を含む引数に対して機能します。DmitrySokolovの回答に基づいています。2番目の引数が最初の引数と同じである場合の問題を修正しました。

@echo off
echo %*
set _tail=%*
call set _tail=%%_tail:*%1=%%
echo %_tail%
7
Raman Zhylich

以下は、"=' 'を使用した引数に対して機能します(@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
5
Dmitry Sokolov

これにはSHIFTを使用できます。 %1を削除し、他のすべての引数を1つ下げます。このスクリプトは、%2の後のすべての引数を出力し(%3、%4 ...を出力します)、そのうちの1つが空になるまで(最後の引数です):

@echo off

SHIFT
SHIFT

:loop
if "%1" == "" goto end
echo %1
SHIFT
goto loop

:end

編集:これは機能しないため、%*を使用した例を削除しました-%*は常にすべてのパラメーターを出力します

4
schnaader

セビ、これが 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
BUZA László

シュナーダーの答えに基づいて、%1以降のすべてを連結したい場合は、これでうまくいくと思います。

@echo off

SHIFT

set after1=

:loop
if "%1" == "" goto end
set after1=%after1% %1
SHIFT
goto loop


:end

echo %after1%
1
Scott Langham