PowerShellに慣れようとしているのに、未だにWindowsバッチファイルで処理してしまう老眼SEです。
備忘録
バッチファイルで利用できる引数は%0から%9までだと思っていたのですが文法上の制限で、実際にはそれ以上利用できるのを知りました。
Windows Batch Scripting: Variables
http://steve-jansen.github.io/guides/windows-batch-scripting/part-2-variables.html
NOTE: DOS does support more than 9 command line arguments, however, you cannot directly read the 10th argument of higher. This is because the special variable syntax doesn’t recognize %10 or higher. In fact, the shell reads %10 as postfix the %0 command line argument with the string “0”. Use the SHIFT command to pop the first argument from the list of arguments, which “shifts” all arguments one place to the left. For example, the the second argument shifts from position %2 to %1, which then exposes the 10th argument as %9.
Windows 7(7601)で検証してみました。
- サンプル1
- サンプル2
- サンプル3
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@echo off :: command line arguments test echo [0]: %0 echo [1]: %1 echo [2]: %2 echo [3]: %3 echo [4]: %4 echo [5]: %5 echo [6]: %6 echo [7]: %7 echo [8]: %8 echo [9]: %9 echo [10]: %10 |
結果
%10は%1と0が連結して表示されています。
1 2 3 4 5 6 7 8 9 10 11 12 |
D:\Work>command-line.cmd "C:\Program Files (x86)" A B C D E F G H I J K [0]: command-line.cmd [1]: "C:\Program Files (x86)" [2]: A [3]: B [4]: C [5]: D [6]: E [7]: F [8]: G [9]: H [10]: "C:\Program Files (x86)"0 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
@echo off :: command line arguments test echo [0]: %0 echo [1]: %1 echo [2]: %2 echo [3]: %3 echo [4]: %4 echo [5]: %5 echo [6]: %6 echo [7]: %7 echo [8]: %8 echo [9]: %9 echo shift command shift echo [0]: %0 echo [1]: %1 echo [2]: %2 echo [3]: %3 echo [4]: %4 echo [5]: %5 echo [6]: %6 echo [7]: %7 echo [8]: %8 echo [9]: %9 |
結果
shiftコマンドで一つシフトして10番目の”I”が%9に入りました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
D:\Work>command-line.cmd "C:\Program Files (x86)" A B C D E F G H I J K [0]: command-line.cmd [1]: "C:\Program Files (x86)" [2]: A [3]: B [4]: C [5]: D [6]: E [7]: F [8]: G [9]: H shift command [0]: "C:\Program Files (x86)" [1]: A [2]: B [3]: C [4]: D [5]: E [6]: F [7]: G [8]: H [9]: I |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
@echo off :: command line arguments test echo [0]: %0 echo [1]: %1 echo [2]: %2 echo [3]: %3 echo [4]: %4 echo [5]: %5 echo [6]: %6 echo [7]: %7 echo [8]: %8 echo [9]: %9 echo shift command shift /8 echo [0]: %0 echo [1]: %1 echo [2]: %2 echo [3]: %3 echo [4]: %4 echo [5]: %5 echo [6]: %6 echo [7]: %7 echo [8]: %8 echo [9]: %9 |
結果
sift /8 で%8からシフトします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
D:\Work>command-line.cmd "C:\Program Files (x86)" A B C D E F G H I J K [0]: command-line.cmd [1]: "C:\Program Files (x86)" [2]: A [3]: B [4]: C [5]: D [6]: E [7]: F [8]: G [9]: H shift command [0]: command-line.cmd [1]: "C:\Program Files (x86)" [2]: A [3]: B [4]: C [5]: D [6]: E [7]: F [8]: H [9]: I |
1 2 3 4 5 6 7 8 9 10 11 12 |
C:\>shift /? バッチ ファイル中の置き換え可能なパラメーターの位置を変更します。 SHIFT [/n] コマンド拡張機能を有効にすると、SHIFT コマンドは、/n スイッチをサポート するようになります。このスイッチを指定すると、コマンドはシフトを n 番 目の引数から開始します。n は、0 から 8 までの数です。たとえば、 SHIFT /2 は、%3 を %2 に、%4 を %3 にシフトし、%0 と %1 はシフトしません。 |
さてshiftするのに引数の個数を調べる必要があります。
Batch files – number of command line arguments
https://stackoverflow.com/questions/1291941/batch-files-number-of-command-line-arguments
なるほど%*ですべての引数が分かるのでforでカウントするんですね。
1 2 3 4 |
set argC=0 for %%x in (%*) do Set /A argC+=1 echo %argC% |
応用
for文で上手くいかなかったのでgotoで回してます。またshift /8が一つ余分な気がするのですが、削除すると結果がダメなんだすよね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
@echo off :: command line arguments test set argC=0 for %%x in (%*) do Set /A argC+=1 echo number of command line arguments: %argC% echo [0]: %0 echo [1]: %1 echo [2]: %2 echo [3]: %3 echo [4]: %4 echo [5]: %5 echo [6]: %6 echo [7]: %7 echo [8]: %8 echo [9]: %9 shift /8 set /A ShiftC=%argC%-9 set x=1 setlocal enabledelayedexpansion :loop if %x% LEQ %ShiftC% ( set /a s=9+!x! shift /8 echo [!s!]: %9 set /A x+=1 goto loop ) else ( goto end ) :end |
結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
D:\Work>command-line.cmd "C:\Program Files (x86)" A B C D E F G H I J K L M number of command line arguments: 14 [0]: command-line.cmd [1]: "C:\Program Files (x86)" [2]: A [3]: B [4]: C [5]: D [6]: E [7]: F [8]: G [9]: H [10]: I [11]: J [12]: K [13]: L [14]: M |
こんなの利用することも無いと思いますが 😛
おまけ
参考サイト:Windowsバッチファイル変数
http://capm-network.com/?tag=Windowsバッチファイル変数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
@echo off :: command line arguments test set argC=0 for %%x in (%*) do Set /A argC+=1 echo number of command line arguments: %argC% echo. echo [%%0]: %0 echo [%%*]: %* echo [%%~1]: %~1 echo [%%~f0]: %~f0 echo [%%~d0]: %~d0 echo [%%~p0]: %~p0 echo [%%~n0]: %~n0 echo [%%~x0]: %~x0 echo [%%~s0]: %~s0 echo [%%~a0]: %~a0 echo [%%~t0]: %~t0 echo [%%~z0]: %~z0 echo. echo [%%~dp0]: %~dp0 echo [%%~fs0]: %~fs0 echo [%%~nx0]: %~nx0 :end |
結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
D:\Work>command-line.cmd "C:\Program Files (x86)" A B C number of command line arguments: 4 [%0]: command-line.cmd [%*]: "C:\Program Files (x86)" A B C [%~1]: C:\Program Files (x86) [%~f0]: D:\Work\command-line.cmd [%~d0]: D: [%~p0]: \Work\ [%~n0]: command-line [%~x0]: .cmd [%~s0]: D:\Work\COMMAN~1.CMD [%~a0]: --a------ [%~t0]: 2018/03/02 18:32 [%~z0]: 455 [%~dp0]: D:\Work\ [%~fs0]: D:\Work\COMMAN~1.CMD [%~nx0]: command-line.cmd |