[前の記事]« バッチファイルでテキストファイル内に指定した文字を記入(追加)したい
[次の記事][NT系]テキストのアペンド処理前に改行を入れるバッチ処理 »

関連オンラインソフト配布サイト:
Vector>ダウンロード(top) |>MS-DOSまたは汎用 | >WindowsVista/XP/2000/NT

▲カテゴリー「FOR .. IN ( ) DO..」索引へ

FOR .. IN (Set) DO...の (Set) 部分の記述方法

847.
引数の処理について
2004年09月25日(土) 03時17分
バットガイ
●DOS/Windowsのバージョン↓
Windows XP Home SP2

はじめまして。バッチコマンドを勉強してまだ一週間くらいです。
どうしても分からないことがあり、質問させていただきます。

あるバッチファイルにドラッグ&ドロップ(以後D&D)等で送った、引数%1の処理についてです。
この場合、%1はフルパスになりますが、
この%1が、フォルダの場合は「そのままのフルパス」を、それ以外の場合は
その「ファイル等があるフォルダのフルパス」を取得し、
そのフルパスをカレントフォルダとしたいのですが、うまくいきません。

例)
C:\Tools フォルダをD&Dした場合 → 「C:\Tools」を取得
C:\sample\test.txt をD&Dした場合 → 「C:\sample」を取得

よい方法があればご教示いただけると嬉しいです。
よろしくお願いいたします。


あと、for文の使い方が今ひとつ分かりません。
マイクロソフトのヘルプを見ても、特に(Set)に使える値の種類が全然分かりません。
もし、分かりやすく説明してあるところがあれば教えていただけませんか?
850.
Re:引数の処理について
2004年09月26日(日) 02時23分
oo
>●DOS/Windowsのバージョン↓
>Windows XP Home SP2

>はじめまして。バッチコマンドを勉強してまだ一週間くらいです。
>どうしても分からないことがあり、質問させていただきます。

>あるバッチファイルにドラッグ&ドロップ(以後D&D)等で送った、引数%1の処理についてです。
>この場合、%1はフルパスになりますが、
>この%1が、フォルダの場合は「そのままのフルパス」を、それ以外の場合は
>その「ファイル等があるフォルダのフルパス」を取得し、
>そのフルパスをカレントフォルダとしたいのですが、うまくいきません。

>例)
>C:\Tools フォルダをD&Dした場合 → 「C:\Tools」を取得
>C:\sample\test.txt をD&Dした場合 → 「C:\sample」を取得

>よい方法があればご教示いただけると嬉しいです。
>よろしくお願いいたします。

色々書き方がありますが、わかりやすさ優先で行くと、
@echo off
dir /ad "%~1" >NUL 2>NUL
if %ERRORLEVEL%==0 set FOLDER="%~1"&goto next
  set FOLDER=%~dp1
  set FOLDER="%FOLDER:~0,-1%"
:next
echo %FOLDER%

>あと、for文の使い方が今ひとつ分かりません。

本来別々の命令にするべきだったのに同じfor文に機能を詰め込みすぎなのでわかりにくくなってますが、
書き方が違うものは別の命令と思ったほうが良いでしょう。

>マイクロソフトのヘルプを見ても、特に(Set)に使える値の種類が全然分かりません。

set で代入できる文字の種類ということでしょうか?
例えば & は文の区切りなので、そのままでは set 文の終りと見なされるため代入できません。そういう文字には ^ を前置します。
他にも ^ | < > や 改行、()の中のset文では ) もです。

set X=A^&B で、Xに「A&B」がセットできます。set "X=A&B" という方法もあります。

>もし、分かりやすく説明してあるところがあれば教えていただけませんか?

私もあれば知りたい。見つからないので、作ろうかと思っています。
852.
Re2:引数の処理について
2004年09月26日(日) 08時07分
YanaKen
ooさん、バットガイさん こんにちは。

>>マイクロソフトのヘルプを見ても、特に(Set)に使える値の種類が全然分かりません。

>set で代入できる文字の種類ということでしょうか?
 バットガイさんのご質問は「FOR .. IN (Set) DO...」の (Set)の部分、ということだと思います。
 スイッチごとに指定できる内容が変化するので、確かにわかりにくい部分ですね。(特に /F がらみが難解)

●バットガイさん
 for コマンドそのものについては、当サイトでは下記に解説ページがあります。
 http://fpcu.on.coocan.jp/dosvcmd/batch.htm#for
 (Set)部分にスポットを当てた書き方ではないですが、基本形とNT系の拡張部分を分離し、いくつか簡単な用例もつけてあるので、現状でも入門用としてはヘルプより多少わかりやすいかもしれません。

●ooさん
>私もあれば知りたい。見つからないので、作ろうかと思っています。
 これは SET コマンドの解説、ということですね。
 うちのサイトのSETコマンドのページはそういえば現状DOS5ベースのままで、先日バッチ処理関係をようやく大幅補筆した際にも(SETは別ページなので)忘れてました(^^;。ひさびさに改訂を考えたいと思います。

Manager YanaKen
854.
Re3:引数の処理について
2004年09月26日(日) 13時18分
バットガイ
レスありがとうございます。

>ooさん
そのコマンドで希望通りの動作になりました。ありがとうございます。
ところで、今回のコマンドの
 set FOLDER="%FOLDER:~0,-1%"の内、
「:~0,-1」はどういう処理指定なのでしょうか?
パスの最後の「\」を削除しているのだということは分かるのですが、
その構文の意味(と言えばいいのでしょうか?)が調べても分かりませんでした。
もしよろしければ解説を、もしくはその解説がされているところがあれば
教えていただけませんでしょうか?


>YanaKenさん
確かにマイクロソフトのヘルプよりは分かりやすいです。ありがとうございます。
参考にさせていただき、勉強しようと思います。


>(Set)に使える値の種類
今回の質問の意図は、YanaKenさんのおっしゃるとおりです。雑な説明ですみませんでした。
でも、ooさんが回答してくださったことも知らなかったのでためになりました。

過去ログを検索していると
[WIN2000/XP]現在のディレクトリ名を取得する方法
にあるような、for文の(Set)の意味が分からなかったりすることが多く、ちょっと辛いです。
855.
Re4:引数の処理について
2004年09月26日(日) 15時18分
YanaKen
バットガイさん どうも。

> set FOLDER="%FOLDER:~0,-1%"の内、
>「:~0,-1」はどういう処理指定なのでしょうか?
>パスの最後の「\」を削除しているのだということは分かるのですが、
>その構文の意味(と言えばいいのでしょうか?)が調べても分かりませんでした。
>もしよろしければ解説を、もしくはその解説がされているところがあれば
>教えていただけませんでしょうか?

 おそらくWindowsのGUI画面上のSETのヘルプはすでにご覧になったのだと思いますが、コマンド・プロンプトの情報源としてはもう1つ、コマンド・プロンプト上で、
 SET /?
 とすることで表示されるヘルプがあり、「こちらのほうでだけ詳細な情報が提供されている」というケースが多々あります(逆も若干あるみたいですが)。
 「展開の副文字列」を指定することで環境変数文字列の一部だけを抜き出す用法については、SET /?のほうだけで説明されていますので、ご覧になってみてください。(FORについても同様です)

>過去ログを検索していると
[WIN2000/XP]現在のディレクトリ名を取得する方法
>にあるような、for文の(Set)の意味が分からなかったりすることが多く、ちょっと辛いです。

 その記事というのは、
>for %%I in (.) do set DIRNAME=%%~nI%%~xI
 ……という、( )の中に"."だけが入っているものですね。
 これは特殊な用例ですし、どんなに詳しいFORの解説文を見ても(それだけでは)たぶんわからないと思いますので、ここだけあらためて説明してみます(^^;。

 まず、FORコマンドの (set) 部分に入る文字列というのは、本来は次の2種類だけです。

(A)スペースで区切った任意の文字列を指定すれば、それらは順ぐりに%%Aに代入されます。
例  FOR %%A IN (ABC 123) DO ECHO %%A

(B)ワイルドカードを含むファイル/ディレクトリ名を指定すると、指定に合致する具体的なファイル名/ディレクトリ名が、順次%%Aに入ります。
例  FOR %%A IN (C:\DOC\*.TXT) DO TYPE %%A | MORE

 上の「for %%I in (.) do ..」は(B)の応用例で、"."は特に「FORの( )内専用」とかいったものではなく、ファイル/ディレクトリを階層つきで表現する場合の「現在のディレクトリ」という意味を持つ記号です。たとえば、
 dir .
 xcopy . z:
 など、「現在のディレクトリ」を明示的に(かつ、簡易に)指定したい場合にたまに使います。
 似たものに「..」というのがあって、これは「1つ上のディレクトリ」を示し、「CD ..」とか「dir ..」など、慣れればコマンド・プロンプト上での作業に何かと重宝な特殊記号です。

※NT系のFORコマンドは機能が大幅に拡張されていて、FORの後に/Fなどのスイッチをつけた場合に限り、上記の前提が崩れてだいぶ文法が複雑になってきます。FORコマンド関連の過去ログも、そのへんを区別して読むとだいぶわかりやすくなるかと思います。

YanaKen
856.
Re5:引数の処理について
2004年09月26日(日) 15時52分
バットガイ
>YanaKenさん

おかげさまで今ある疑問が全て解決しました。
「SET /?」を実行してみたら・・・本当にこちらの方が詳しいですね。
まずは「/?」を見るクセをつけようと思います。

> for %%I in (.) do set DIRNAME=%%~nI%%~xI
の説明も、私が気になるところを見事に潰しながらされており、非常に分かりやすかったです。
「.」はfor文の(Set)専用ではなく、現在のディレクトリを示す特殊記号、だったのですね。
これはちょっと考えただけでも便利そうです。

すっきりしました。本当にありがとうございました。
 

 

847.引数の処理について バットガイ 04/09/25(土) 03:17
850.Re:引数の処理について oo 04/09/26(日) 02:23
852.Re2:引数の処理について YanaKen 04/09/26(日) 08:07
854.Re3:引数の処理について バットガイ 04/09/26(日) 13:18
855.Re4:引数の処理について YanaKen 04/09/26(日) 15:18
856.Re5:引数の処理について バットガイ 04/09/26(日) 15:52
 
 


カテゴリー「FOR .. IN ( ) DO..」索引へ

 

カテゴリー一覧

FPCU/FPCDIY QUICK LINK online
この上の各ジャンル名をクリックすると、下のウィンドウが切り替わります▼


=リンク集のインデックスはこちら=

資料書籍

About

2004年09月25日 12:26に投稿されたエントリーのページです。

ひとつ前の投稿は「バッチファイルでテキストファイル内に指定した文字を記入(追加)したい」です。

次の投稿は「[NT系]テキストのアペンド処理前に改行を入れるバッチ処理」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

This site is powered by Six Apart
Movable Type 3.33-ja
このブログについて | 運営:有限会社メディアポート