バッチファイルでのドラッグ&ドロップ対応 [Win,コマンドプロンプト]
ファイルのドラッグアンドドロップに対応したWindowsコマンドプロンプトのバッチファイルを作ろうという試み。
あくまでコマンドプロンプトはコマンド・スクリプトベースであり、それ自体がマウス操作を受け付けるわけではありません...
サンプルプログラムはバッチファイルを作ってそのまま実行するのではなく、何かファイルやフォルダーをバッチファイルにドラッグ&ドロップして実行してください。
○引数について
引数の解説→ http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/percent.mspx
基本的には引数と同じように扱えばいいのでやることはそれほど難しくありません。
例えば file1 file2 ...をバッチファイル上にドラッグ&ドロップすると実行パスは
「[バッチファイル] [file1の絶対パス] [file2の絶対パス] ...」
となります。
バッチファイル上では %1 %2 でfile1 file2 の絶対パスを取得できます。
ドラッグ&ドロップしたファイルやフォルダーの絶対パスにスペースが含まれている場合は勝手に引用句が付きます。
コマンドプロンプトの制限により、パスに;や=などの半角記号が含まれているとスペースに変換されるため正しく処理できません。
例1)
基本的には引数と同じように扱えばいいのでやることはそれほど難しくありません。
例えば file1 file2 ...をバッチファイル上にドラッグ&ドロップすると実行パスは
「[バッチファイル] [file1の絶対パス] [file2の絶対パス] ...」
となります。
バッチファイル上では %1 %2 でfile1 file2 の絶対パスを取得できます。
ドラッグ&ドロップしたファイルやフォルダーの絶対パスにスペースが含まれている場合は勝手に引用句が付きます。
コマンドプロンプトの制限により、パスに;や=などの半角記号が含まれているとスペースに変換されるため正しく処理できません。
例1)
@echo off
echo すべての引数(%%*): %*
echo 実行コマンドパス(%%0): %0
echo 引数1(%%1): %1
echo 引数2(%%2): %2
pause
echo on
echo すべての引数(%%*): %*
echo 実行コマンドパス(%%0): %0
echo 引数1(%%1): %1
echo 引数2(%%2): %2
pause
echo on
○修飾子を利用する
%1 %2 ...で取得したパスは引用句が付いていたりそうでなかったりするので修飾子を利用するといいでしょう。
これを利用すれば引用句を削除したり、相対パスを絶対パスにしたりできます。
またファイルの属性やサイズを取得することもできます。
以下forコマンドのヘルプより抜粋
例2)
これを利用すれば引用句を削除したり、相対パスを絶対パスにしたりできます。
またファイルの属性やサイズを取得することもできます。
以下forコマンドのヘルプより抜粋
%~I | すべての引用句 (") を削除して、%I を展開します。 |
%~fI | %I を完全修飾パス名に展開します。 |
%~dI | %I をドライブ文字だけに展開します。 |
%~pI | %I をパス名だけに展開します。 |
%~nI | %I をファイル名だけに展開します。 |
%~xI | %I をファイル拡張子だけに展開します。 |
%~sI | 展開されたパスは短い名前だけを含みます。 |
%~aI | %I をファイルの属性に展開します。 |
%~tI | %I ファイルの日付/時刻に展開します。 |
%~zI | %I ファイルのサイズに展開します。 |
%~$PATH:I | PATH環境変数に指定されているディレクトリを検索し、最初に見つかった完全修飾名に %I を展開します。環境変数名が定義されていない場合、または検索してもファイルが見つからなかった場合は、この修飾子を指定すると空の文字列に展開されます。 |
例2)
@echo off
echo %%1:%1
echo %%~1:%~1
echo %%~f1:%~f1
echo %%~d1:%~d1
echo %%~p1:%~p1
echo %%~n1:%~n1
echo %%~x1:%~x1
echo %%~s1:%~s1
echo %%~a1:%~a1
echo %%~t1:%~t1
echo %%~z1:%~z1
echo %%~$PATH:1:%~$PATH:1
pause
echo on
echo %%1:%1
echo %%~1:%~1
echo %%~f1:%~f1
echo %%~d1:%~d1
echo %%~p1:%~p1
echo %%~n1:%~n1
echo %%~x1:%~x1
echo %%~s1:%~s1
echo %%~a1:%~a1
echo %%~t1:%~t1
echo %%~z1:%~z1
echo %%~$PATH:1:%~$PATH:1
pause
echo on
○応用例1 : ファイルかフォルダーかを判別する
パスがファイルかフォルダーかを判別するには%~aIを使います。
上の修飾子の説明からすると%~nIや%~xIが使えそうな感じがしますが、修飾子はパスがファイルかフォルダーか、そもそも存在するパスなのか判断していませんので使えません。
"."を含むパスがファイルではなくフォルダーである可能性もあるからです。
この例ではいわゆるECHO-FIND-IFを使っています。
つまり %~a1 に d が含まれていたらフォルダーであると判断します。
例3)
上の修飾子の説明からすると%~nIや%~xIが使えそうな感じがしますが、修飾子はパスがファイルかフォルダーか、そもそも存在するパスなのか判断していませんので使えません。
"."を含むパスがファイルではなくフォルダーである可能性もあるからです。
この例ではいわゆるECHO-FIND-IFを使っています。
つまり %~a1 に d が含まれていたらフォルダーであると判断します。
例3)
@echo off
echo %~a1|find "d">NUL
if %ERRORLEVEL% EQU 0 (
echo %~1はフォルダーです。
) else (
echo %~1はファイルです。
)
pause
echo on
echo %~a1|find "d">NUL
if %ERRORLEVEL% EQU 0 (
echo %~1はフォルダーです。
) else (
echo %~1はファイルです。
)
pause
echo on
○応用例2 : 不特定多数の入力パスに対応する
バッチファイルでは %1~%9 を使って9個の引数を取得できます。
10個目以降の引数については %10 などは使えず、SHIFTコマンドを使って引数をずらす必要があります。
次は例2を複数ファイル・フォルダーのドロップに対応させたバージョンです。
例4)
10個目以降の引数については %10 などは使えず、SHIFTコマンドを使って引数をずらす必要があります。
次は例2を複数ファイル・フォルダーのドロップに対応させたバージョンです。
例4)
@echo off
setlocal enableextensions
echo すべての引数:%*
:repeat
set /a count=%count%+1
echo 引数%count%
echo %%1:%1
echo %%~1:%~1
echo %%~f1:%~f1
echo %%~d1:%~d1
echo %%~p1:%~p1
echo %%~n1:%~n1
echo %%~x1:%~x1
echo %%~s1:%~s1
echo %%~a1:%~a1
echo %%~t1:%~t1
echo %%~z1:%~z1
echo %%~$PATH:1:%~$PATH:1
echo.
if "%~2"=="" goto end
shift
goto repeat
:end
endlocal
pause
echo on
setlocal enableextensions
echo すべての引数:%*
:repeat
set /a count=%count%+1
echo 引数%count%
echo %%1:%1
echo %%~1:%~1
echo %%~f1:%~f1
echo %%~d1:%~d1
echo %%~p1:%~p1
echo %%~n1:%~n1
echo %%~x1:%~x1
echo %%~s1:%~s1
echo %%~a1:%~a1
echo %%~t1:%~t1
echo %%~z1:%~z1
echo %%~$PATH:1:%~$PATH:1
echo.
if "%~2"=="" goto end
shift
goto repeat
:end
endlocal
pause
echo on
○応用例3 : 総まとめ
ドラッグ&ドロップしたファイルをMAKECABコマンドを使ってMicrosoftキャビネット形式に圧縮するバッチです。
コマンドプロンプトから直接バッチファイルを実行することもできます。
ドラッグ&ドロップせずにバッチファイルを実行、もしくはパスを指定せずにバッチファイルを実行した場合は使用例を表示して終了します。
MAKECABコマンドの仕様ではフォルダーパスは受け付けないので、指定したパスがフォルダーであればエラーメッセージを表示します。
複雑になるのでしませんでしたが、もっと工夫すればフォルダー入力にも対応できるでしょう。
コマンドプロンプトから直接バッチファイルを実行することもできます。
ドラッグ&ドロップせずにバッチファイルを実行、もしくはパスを指定せずにバッチファイルを実行した場合は使用例を表示して終了します。
MAKECABコマンドの仕様ではフォルダーパスは受け付けないので、指定したパスがフォルダーであればエラーメッセージを表示します。
複雑になるのでしませんでしたが、もっと工夫すればフォルダー入力にも対応できるでしょう。
@echo off
setlocal enableextensions
if "%~1"=="" goto show_help
:repeat
echo 圧縮中: "%~f1"
if not exist "%~f1" goto error_nofile
echo %~a1|find "d">NUL
if %ERRORLEVEL% EQU 0 goto error_isfolder
makecab "%~f1">NUL
goto next
:error_nofile
echo 指定したファイル"%~f1"が見つかりません。
goto next
:error_isfolder
echo フォルダーの圧縮はできません。
goto next
:next
if "%~2"=="" goto end
shift
goto repeat
:show_help
echo 使用例:cp path1 [path2 [...]]
echo または
echo エクスプローラー上でファイル(複数可)をバッチファイルにドラッグ^&ドロップする。
:end
endlocal
echo on
setlocal enableextensions
if "%~1"=="" goto show_help
:repeat
echo 圧縮中: "%~f1"
if not exist "%~f1" goto error_nofile
echo %~a1|find "d">NUL
if %ERRORLEVEL% EQU 0 goto error_isfolder
makecab "%~f1">NUL
goto next
:error_nofile
echo 指定したファイル"%~f1"が見つかりません。
goto next
:error_isfolder
echo フォルダーの圧縮はできません。
goto next
:next
if "%~2"=="" goto end
shift
goto repeat
:show_help
echo 使用例:cp path1 [path2 [...]]
echo または
echo エクスプローラー上でファイル(複数可)をバッチファイルにドラッグ^&ドロップする。
:end
endlocal
echo on