バッチファイルにドロップしたファイルの情報を得る

Y子です。
東京のソメイヨシノは、あらかた散ってしまいましたねー。

今日は、任意のファイルを、バッチファイルにドラッグ＆ドロップした際に得られる情報をまとめます。

「```C:\work dir\test.txt```」というファイルを、マウスでつかんでバッチファイルにドロップする例を考えます。

```bat:filedrop.bat
@echo off

rem 引数がない場合は終了する
if "%~1"=="" (
  echo 引数がありません
  pause
  exit /b
)

rem ドロップしたファイルのフルパス（ダブルクオート付き）「"C:\work dir\test.txt"」
echo %1

rem ドロップしたファイルのフルパス（ダブルクオートなし）「C:\work dir\test.txt」
echo %~1

rem ドロップしたファイルの完全修飾パス名（「%~1」と同じ）「C:\work dir\test.txt」
echo %~f1

rem ドロップしたファイルのドライブレターのみ「C:」
echo %~d1

rem ドロップしたファイルが格納されたフォルダのフルパスから、ドライブレターを除いたもの「\work dir\」
echo %~p1

rem ドロップしたファイルのファイル名だけ（拡張子を除く）「test」
echo %~n1

rem ドロップしたファイルの拡張子だけ（ピリオド含む）「.txt」
echo %~x1

rem ドロップしたファイルの短い名前「C:\WORKDI~1\test.txt」
echo %~s1

rem ドロップしたファイルの属性「--a--------」
echo %~a1

rem ドロップしたファイルの更新日時「2021/04/03 22:05」
echo %~t1

rem ドロップしたファイルのサイズ「1890」
echo %~z1

rem ドロップしたファイルが格納されたフォルダのフルパス「C:\work dir\」
echo %~dp1

rem ドロップしたファイルのフルパスから、拡張子のみを除いたもの「C:\work dir\test」
echo %~dpn1

pause
```

ドラッグ＆ドロップではなく、コマンドラインからファイル名を引数で渡すことでも、同じことができます。
同じファイルでも、フルパスで渡す場合と、同じフォルダのファイルをファイル名だけで渡す場合では、結果が若干違います。
ドラッグ＆ドロップは、フルパスで渡すのと同じことなんですね。

```bat:
> filedrop.bat "c:\work dir\test.txt"
"c:\work dir\test.txt"
c:\work dir\test.txt
c:\work dir\test.txt
c:
\work dir\
test
.txt
c:\WORKDI~1\test.txt
--a--------
2021/04/03 22:05
1890
c:\work dir\
c:\work dir\test
続行するには何かキーを押してください . . .
```

```bat:
> filedrop.bat test.txt
test.txt
test.txt
C:\work dir\test.txt
C:
\work dir\
test
.txt
C:\WORKDI~1\test.txt
--a--------
2021/04/03 22:05
1890
C:\work dir\
C:\work dir\test
続行するには何かキーを押してください . . .
```

なお、コマンド「```call /?```」でhelpが表示されますので、現場で急遽調べたくなったとき用に、このhelpの出し方だけ覚えておいても良いのかもしれません。(ないか、そんなこと…)

```bat:
> call /?

バッチ プログラムを別のバッチ プログラムから呼び出します。

CALL [ドライブ:][パス]ファイル名 [バッチパラメーター]

  バッチパラメーター   バッチ プログラムで必要なコマンド ライン情報を指定します。

コマンド拡張機能を有効にすると、CALL は次のように変更されます:

CALL コマンドは、CALL のターゲットとしてラベルを受け付けるようになります。
構文は、次のとおりです:

    CALL :ラベル 引数

指定された引数で新しいバッチ ファイル コンテキストが作成され、指定
されたラベルの次の文に制御が渡されます。バッチ スクリプト ファイルの
最後に 2 回到達することによって、2 回 "終了" する必要があります。
1 回目に最後に到達したときには、制御は CALL 文の次の行に返されます。
2 回目に、バッチ スクリプトが終了します。バッチ スクリプトから "戻る"
ための GOTO :EOF 拡張機能の説明については、GOTO /? と入力してください。

また、バッチ スクリプトの引数参照 (%0、%1 など) の展開は、次のように
変更されました:


    %* バッチ スクリプト内では、すべての引数 (%1、%2、%3、%4、
        %5 など) を参照します。

    バッチ パラメーター (%n) の置換は拡張されました。次のオプション構文
    を使うことができます:

        %~1         - すべての引用句 (") を削除して、%1 を展開します。
        %~f1        - %1 を完全修飾パス名に展開します。
        %~d1        - %1 をドライブ文字だけに展開します。
        %~p1        - %1 をパスだけに展開します。
        %~n1        - %1 をファイル名だけに展開します。
        %~x1        - %1 をファイル拡張子だけに展開します。
        %~s1        - 展開されたパスは、短い名前だけを含みます。
        %~a1        - %1 をファイル属性に展開します。
        %~t1        - %1 をファイルの日付/時刻に展開します。
        %~z1        - %1 をファイルのサイズに展開します。
        %~$PATH:1   - PATH 環境変数に指定されているディレクトリを検索し、
                       最初に見つかった完全修飾名に %1 を展開します。
                       環境変数名が定義されていない場合、または
                       検索してもファイルが見つからなかった場合は、
                       この修飾子を指定すると空の文字列に展開されます。

    修飾子を組み合わせて、複合結果を得ることもできます:

        %~dp1       - %1 をドライブ文字とパスだけに展開します。
        %~nx1       - %1 をファイル名と拡張子だけに展開します。
        %~dp$PATH:1 - PATH 環境変数に指定されているディレクトリを
                       検索して %1 を探し、最初に見つかったファイル
                       のドライブ文字とパスだけに展開します。
        %~ftza1     - %1 を DIR の出力行のように展開します。

    上の例の %1 と PATH は、他の有効な値で置き換えることができ
    ます。%~ 構文は有効な引数の数によって区切られます。%~ 修飾子
    は %* と同時には使用できません。
```

ファイルをドロップするだけでそのファイルの情報が得られるので、ちょっとしたツールなんか作れそうですよね。

こんどやってみよ。

ではまた！