[前の記事]« コマンドラインから.exe形式の自己解凍ファイルを作成する方法
[次の記事]6ヶ月以上更新がないファイルを削除したい »

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

▲カテゴリー「FOR .. IN ( ) DO..」索引へ
▲カテゴリー「遅延環境変数の展開」索引へ

ファイル名が条件にマッチした場合の分岐処理

1445.
ファイル名によって処理を分岐させる方法について
2006年10月15日(日) 11時13分
りょう
・環境
 WindowsXPProffesional
・質問
 あるフォルダから複数のファイル名を取得し、ファイル名によって処理を切り替える(ファイル名が条件にマッチすれば処理を行う。処理が正常終了した場合と異常終了した場合のハンドリングを含む。これを全ファイルに対して行う)方法を教えていただきたいです。
 現在、dirコマンドにより、ファイル名をテキストファイルに出力し、そのファイルを1行ずつfor文で回すという処理を行おうと思っていたのですが、処理文中にif文やgoto文がある為か、ファイル名を取得する事ができない状態です。
 よろしくお願いいたします。
1446.
Re:ファイル名によって処理を分岐させる方法について
2006年10月15日(日) 22時45分
りょう
具体的にはこのようなスクリプトになっています。


dir /B %ディレクトリ%>>%Temp%

FOR /F %%A in (%Temp%) do (

  set RECEPTED_FILE_NAME=%%A
  @echo 処理対象ファイル:%RECEPTED_FILE_NAME%>>%ログ%

 処理部(If文、goto文含む) 
)


この様な記述で変数RECEPTED_FILE_NAMEにファイル名がセットされていない状態になっています。
それともこのような記述は不可能なのでしょうか。教えてください。
1447.
Re:ファイル名によって処理を分岐させる方法について
2006年10月15日(日) 23時29分
YanaKen◆c0rnJ1Q=
りょうさん、こんにちは。

>FOR /F %%A in (%Temp%) do (
>
>  set RECEPTED_FILE_NAME=%%A
>  @echo 処理対象ファイル:%RECEPTED_FILE_NAME%>>%ログ%
>
> 処理部(If文、goto文含む) 
>)
>
>
>この様な記述で変数RECEPTED_FILE_NAMEにファイル名がセットされていない状態になっています。
>それともこのような記述は不可能なのでしょうか。教えてください。

 まず「遅延環境変数」というキーワードに注意しつつ下記の各コマンドのヘルプをご覧になることをおすすめします。

cmd /?
set /?
setlocal /?

 実用上は次の2点の修正で希望通り動作すると思います。

[1]問題のFORコマンドの前に、下記を宣言する。
SETLOCAL ENABLEDELAYEDEXPANSION

[2]( )内では、セットした環境変数は%ではなく!で囲んで参照する。
例:@echo 処理対象ファイル:!RECEPTED_FILE_NAME!

※ここは間違いやすい部分なので、このBBSの過去ログにもたびたび関係の話題が出てきます。ブログに移行済みのものから1つご紹介しておきます。
http://fpcu.on.coocan.jp/dosvcmd/bbs/log/cat3/if/3-0092.html

YanaKen


1448.
Re:ファイル名によって処理を分岐させる方法について
2006年10月16日(月) 09時46分
りょう
YanaKenさん、ありがとうございました!!
echoコマンドで正常に変数の中身が出てきました!!
本当にありがとうございます。

ただ・・・
echoの後にif文で

 if !RECEPTED_FILE_NAME!==条件 goto 処理1 else goto 処理2

とすると、!RECEPTED_FILE_NAME!がそのまま出力されている状況です。こちらについての対処は何かよい方法があるのでしょうか。教えていただきたいです。
また、追加質問になってしまうのですが、この条件にはワイルドカードを使った条件は設定可能なのでしょうか?合わせて教えていただきたいです。
よろしくお願いいたします。


1453.
Re:ファイル名によって処理を分岐させる方法について
2006年10月16日(月) 17時15分
YanaKen◆c0rnJ1Q=
りょうさん

> if !RECEPTED_FILE_NAME!==条件 goto 処理1 else goto 処理2
>
>とすると、!RECEPTED_FILE_NAME!がそのまま出力されている状況です。こちらについての対処は何かよい方法があるのでしょうか。教えていただきたいです。

 echo onで動作チェックしていて「あれっ」と思った、ということみたいですね。
 SETLOCAL ENABLEDELAYEDEXPANSIONで有効となる !環境変数! (遅延環境変数)は、処理の「最中」に逐一、実際の値が割り当てられます(ここが「遅延」たるゆえんで、通常の環境変数は実行前に展開されてしまいます)。
 したがって、コマンドの内容が画面にechoされた時点では、まだ実際の値に変換されていないのが「正常」ということになります。
 ためしにechoの行の頭の@マークをはずして確認すれば、そこもやはり!RECEPTED_FILE_NAME!のまま表示されているはずですが、しかし実行結果には代入した環境変数の値がちゃんと反映されているハズです。
 ややこしい説明になりましたが、要するに、その状態で別に問題ないと思われます。

>また、追加質問になってしまうのですが、この条件にはワイルドカードを使った条件は設定可能なのでしょうか?
 というか、前回のご質問では見落としてましたが、なさりたいことはどうも「テンポラリフォルダに存在するファイルの名前を変数に入れ、検査して条件分岐」ということのようですね。
 ならばそもそも /f は不要だと思われますし、/fなしのforコマンドにはワイルドカードが使えます。
  for %%a in (*.txt) do 。。。。
 ワイルドカードでのファイル検索に加えて個々の(テキスト)ファイルの内容に関連した処理も必要ということでしたら、forのループ内にfor /fのループを入れ子にする形にされるとよいと思います。

YanaKen

1470.
Re:ファイル名によって処理を分岐させる方法について
2006年10月19日(木) 09時41分
りょう
YanaKenさん

質問をさせていただいたりょうです。
遅くなってしまいましたが今回は本当にありがとうございました。
YanaKenさんのおっしゃる様に/Fの記述を落として処理を実行させることができました。

DOの後の(処理)が長くなってしまった為か処理が行われないというエラーが発生し、また、子バッチで処理を行おうとすると環境変数が読み込まれないとい うエラーも発生し、立ち往生もしたのですが、親バッチ上でサブルーチンを使い、処理を行うという方法でやっと解決できました。
ありがとうございました。

本当に初心者で、申し訳ない質問ではあったのですがとても丁寧に教えていただき感謝しています。
YanaKenさん本当にありがとうございました。



 
 
 


カテゴリー「FOR .. IN ( ) DO..」索引へ
カテゴリー「遅延環境変数の展開」索引へ

 

カテゴリー一覧

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


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

資料書籍

About

2006年10月15日 11:43に投稿されたエントリーのページです。

ひとつ前の投稿は「コマンドラインから.exe形式の自己解凍ファイルを作成する方法」です。

次の投稿は「6ヶ月以上更新がないファイルを削除したい」です。

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

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