• ベストアンサー

コマンドプロンプトの「%1」と「%~1」の違いがわからない

コマンドプロンプトの「%1」と「%~1」の違いがわからない このサイトにhttp://ykr414.com/dos/bat.html %~1は「全ての引用句(")を削除して%1を展開する。」とありますがよくわかりません。 %1は入力されたファイルのフルパスだと思っているのですけど。 "%1"=%~1ということでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.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"」という、正しくクオートされたファイル名を作ることができます。

misutensu430
質問者

お礼

おお詳しくありがとうございます。""が付くかつかないでいいんですね。 何やら複雑な機能があるのかと思っていましたが、安心しました。

その他の回答 (2)

noname#159916
noname#159916
回答No.3

No.2 です。 >%1は入力されたファイルのフルパスだと思っているのですけど。 最初、何の事かよくわからなかったのですが、 エクスプローラ画面上で、処理したいファイルを バッチファイルにドラッグ&ドロップすると バッチファイルにフルパス名を渡す事ができますが、 フルパスの途中にスペースが入っていると " 付きで渡されます。 バッチファイル内で " が邪魔な場合は %~1 と指定すればいい、 という事です。

misutensu430
質問者

お礼

"付きなら%1、いらないなら%~1でいいんですね。

noname#159916
noname#159916
回答No.2

コマンド入力時に、バッチファイル名の後ろに与えられたパラメータを %1 などの変数の形で受け取りますが、デリミタ(仕切)文字がスペースなので、 スペースを含むパラメータは分割されてしまう為、それを防ぐのに " で囲みます。 ところが " 付きのまま渡されるので、それが邪魔な場合には %~1 と書けばそれを取り除いてくれるという事です。 やってみれば早いんですが。 バッチファイル TEST.bat を1コ作ります。 内容 は2行だけ ------------ echo %1 echo %~1 -------------------- で、DOSプロンプトから >test "abc def" とコマンド入力すると >echo "abc def"   を実行して "abc def"        と表示され >echo abc def     を実行して abc def          と表示されます。 ちなみに、 >test abc def     とコマンド入力すると >echo abc       %1 には abc だけが代入されて表示され、 abc               def は %2 に代入されますが >echo abc         どこにも使う記述がないので表示もされません。 abc

misutensu430
質問者

お礼

あー自分でバッチファイル作って確認すればよかったですね。 使いどきがわかりました。

関連するQ&A