ソース
setlocal set argc=0 for %%a in (%*) do set /a argc+=1
解説
if "%1"=="" などとしてもよいが、%1の内容にクォートが含まれる場合にはエラーになってしまう。たとえば、下記のように"Program Files"を含みたいような場合。
%1="C:\Program Files\" if ""C:\Program Files\""=="" echo 1 Files\""=="" の使い方が誤っています。
引数の全指定 "%*" はSHIFTの影響を受けないので、以下のようなソースの場合には問題を生ずる。
echo [%*] %1 %2 %3 %4 %5 shift echo [%*] %1 %2 %3 %4 %5 shift echo [%*] %1 %2 %3 %4 %5
引数として(1 2 3 4 5 6 7 8)を与えた場合:
[1 2 3 4 5 6 7 8] 1 2 3 4 5 [1 2 3 4 5 6 7 8] 2 3 4 5 6 [1 2 3 4 5 6 7 8] 3 4 5 6 7
上記の方法では%1と%2を固定しつつ、それ以降を%*として使い、%10以上も安全にアクセスできるようにすることができない(SHIFTをしても%*がシフトされないため)。
実例
alias.cmd
@echo off setlocal set argc=0 for %%a in (%*) do set /a argc+=1 set name=%1 set prog=%2 if %argc% lss 2 ( echo usage: alias alias-name binary-path echo example: alias ls c:\bin\ls.exe ) else ( echo @echo off>d:\bin\%name%.cmd echo %prog% %3 %4 %4 %5 %6 %7 %8 %9 %%*>>d:\bin\%name%.cmd )