質問: コマンドプロンプトの「%1」と「%~1」の違いがわからない コマンドプロンプトの「%1」と「%~1」の違いがわからない このサイトにhttp://ykr414.com/dos/bat.html %~1は「全ての引用句(")を削除して%1を展開する。」とありますがよくわかりません。 %1は入力されたファイルのフルパスだと思っているのですけど。 "%1"=%~1ということでしょうか。
回答: %1は、バッチファイルに指定された「第一引数」です。 バッチファイルに限らず、プログラムを実行するときには引数を指定することができます。 単純に関連づけて実行するとかバッチファイルのアイコンにファイルをにドラッグドロップするとかだと、引数は一つない場合が多いですが、 実際にはショートカットを作ったりコマンドプロンプトから指定するとか、二つ以上の引数を指定することができます。 その際、引数と引数の間はスペースで区切られます。(引数指定全体の文字列を、スペースで区切って各引数に分割する) 一方、例えば、マイドキュメントフォルダ「c:\documents and settings\ユーザー名\my documents」を引数にを指定した場合、そのままだとフォルダ名に空白が入ってるので、 %1=c:\documents %2=and %3=settings\ユーザー名\my %4=documents と、指定した一つの名前が複数の引数に分断されてしまします。 そこで、こういう場合には、ダブルクオートでファイル名を括ります。 プログラム起動時の引数に 「"c:\documents and settings\ユーザー名\my documents"」 といった感じで、ダブルクオートを付けたものを指定すると、 %1="c:\documents and settings\ユーザー名\my documents" と、括られた部分がまとめて一つの引数と取り扱われるようになります。 そして、この時%~1は %~1=c:\documents and settings\ユーザー名\my documents になります。 %1と%~1の使い分けですが、 引数をこのままファイル名として使う時は、%1をそのまま使えば問題ないのです。 (バッチファイルから別のプログラムを起動するときにファイル指定するとかだったら、 %1を使えば、ダブルクオート込みで渡されるので、そのまま一つの引数としてつかます) 一方、フォルダを指定してそのフォルダ下のファイル名を作る、といった処理をしようとする時には、 ダブルクオートが邪魔なので、そういう時は%~1を使います。 たとえば、指定した引数をフォルダとして、そのフォルダ下の「新規作成データ.txt」ファイルを表すフルパスのファイル名を作りたい場合、 単に 「%1\新規作成データ.txt」とすると、「"c:\documents and settings\ユーザー名\my documents"\新規作成データ.txt」になってしまいますが、 「"%~1\新規作成データ.txt"」とすれば「"c:\documents and settings\ユーザー名\my documents\新規作成データ.txt"」という、正しくクオートされたファイル名を作ることができます。