プロが教えるわが家の防犯対策術!

コマンドプロンプトの「%1」と「%~1」の違いがわからない
このサイトにhttp://ykr414.com/dos/bat.html
%~1は「全ての引用句(")を削除して%1を展開する。」とありますがよくわかりません。

%1は入力されたファイルのフルパスだと思っているのですけど。
"%1"=%~1ということでしょうか。

A 回答 (3件)

%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"」という、正しくクオートされたファイル名を作ることができます。
    • good
    • 16
この回答へのお礼

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

お礼日時:2010/10/19 21:06

No.2 です。



>%1は入力されたファイルのフルパスだと思っているのですけど。

最初、何の事かよくわからなかったのですが、
エクスプローラ画面上で、処理したいファイルを
バッチファイルにドラッグ&ドロップすると
バッチファイルにフルパス名を渡す事ができますが、
フルパスの途中にスペースが入っていると " 付きで渡されます。

バッチファイル内で " が邪魔な場合は %~1 と指定すればいい、
という事です。
    • good
    • 2
この回答へのお礼

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

お礼日時:2010/10/19 21:09

コマンド入力時に、バッチファイル名の後ろに与えられたパラメータを


%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
    • good
    • 1
この回答へのお礼

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

お礼日時:2010/10/19 21:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A