21159

[code]

    xxx.bat <command> arg1 arg2 ...
    
[/code]

バッチファイルで別のコマンド群を呼び出すフロントエンド的な使い方をしたいと考えています。`git <command>`のようなイメージです。

最初は以下のように書いてましたが、10個目以降の引数が無視されてしまうため使い勝手はあまりよくありませんでした。

[code]

    @echo off
    set COMMAND=\path\to\%1
    %COMMAND% %2 %3 %4 %5 %6 %7 %8 %9
    
[/code]

バッチファイルで第2引数以降をすべて取得する方法、あるいは別の解決策はあるでしょうか？


CC BY-SA 3.0
2016-01-21T16:35:35.560
21156
2016-01-22T19:33:54.737
2391
question
batch-file
第2引数以降を別コマンドの引数に渡したい


`shift` でパラメータを一つずらす（若くする）ことができますから  
コード例サンプルは次のように書くことができます。  
（第２引数以降をループして環境変数に一つずつ結合します。）

[code]

    @echo off
    set COMMAND=\path\to\%1
    shift
    set TARG=
    :check
    if "%1"=="" goto final
    set TARG=%TARG% %1
    shift
    goto check
    :final
    %COMMAND% %TARG%
    set TARG=
    
[/code]


CC BY-SA 3.0
2016-01-21T19:57:16.803
21158
2016-01-21T20:18:17.270
2016-01-21T20:18:17.270
5044
5044
21156
answer


## 方法1

`%*`ですべての引数を参照できますので、これをループで回します。

コマンドプロンプトでは`()`を抜けるまでsetした環境変数が適用されないため、`setlocal
enabledelayedexpansion`して遅延環境変数の展開を有効にします。  
この際`()`内で環境変数を参照する場合は、環境変数名の両端に`!`を付けます。(`%`ではなく)

**参考リンク**  
[豚吐露＠wiki -
Windows/bat/tips/for内でsetした値がforを抜けるまで反映されない](http://www21.atwiki.jp/ohden/pages/474.html)

`set COMMAND=%%~a`は、コマンドとなる最初の引数が`"`で括られていても対応できるように`~`で両端の`"`を除去しています。

[code]

    @echo off
    setlocal enabledelayedexpansion
    set ARGS=
    set POS=cmd
    for %%a in (%*) do (
      if "!pos!"=="cmd" (
        set COMMAND=%%~a
        set POS=arg
      ) else if "!pos!"=="arg" (
        set ARGS=!ARGS! %%a
      )
    )
    
    %COMMAND%%ARGS%
    endlocal
    
[/code]

## 方法2

方法1のような細かいことを考えなければ、`%*`ですべての引数を参照できるので下記のように書けます。

[code]

    @echo off
    \path\to\%*
    
[/code]

## 方法3

引数への参照方法は`%1`～`%9`までしかありませんが、`shift`を使用すると引数を1つずらすことができます。これで引数を`%1`へ1つずつずらしながら、2つ目以降の引数をループで取り出します。

`set COMMAND=%~1`は、コマンドとなる最初の引数が`"`で括られていても対応できるように`~`で両端の`"`を除去しています。

[code]

    @echo off
    set COMMAND=%~1
    
    @shift
    
    if "%1"=="" goto :end
    set ARGS=%1
    
    @shift
    
    :loop
    if "%1"=="" goto :end
    set ARGS=%ARGS% %1
    @shift
    goto :loop
    :end
    
    %COMMAND% %ARGS%
    
[/code]


CC BY-SA 3.0
2016-01-21T20:25:19.183
21159
2016-01-22T19:33:54.737
2016-01-22T19:33:54.737
3068
3068
21156
answer