[前の記事]« 前月名のフォルダをMM形式で作成したい
[次の記事]set /pコマンドで「構文が誤っています」と出てしまう »

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

▲カテゴリー「バッチファイルの文法と環境変数」索引へ
▲カテゴリー「リダイレクト(> <)、パイプ( | )、その他の特殊記号」索引へ

ファイル名に&が含まれているとバッチ処理が中断されてしまう

594.
&を含むファイル名の読込み
2005年07月05日(火) 00時34分
ちばっち
●DOS/Windowsのバージョン↓
Win2k/xp

いつも掲示板を拝見させて頂いております。

削除対象のファイル名が書かれているファイルを読み込んで削除するというバッチファイルを作っているのですが、
ファイル名に&が含まれている場合(例えば"A&B.txt")
&の前で処理が中断してしまいます。

for /f "delims=" %%f in ( dellist.txt ) do ( 
del "!%%f!"
)

&がついているファイル名はForでの読込時には使用できないのでしょうか?
ご教示の程、お願いします。
595.
Re:&を含むファイル名の読込み
2005年07月05日(火) 01時32分
otn
>●DOS/Windowsのバージョン↓
>Win2k/xp
>
>いつも掲示板を拝見させて頂いております。
>
>削除対象のファイル名が書かれているファイルを読み込んで削除するというバッチファイルを作っているのですが、
>ファイル名に&が含まれている場合(例えば"A&B.txt")
>&の前で処理が中断してしまいます。
>
>for /f "delims=" %%f in ( dellist.txt ) do ( 
>del "!%%f!"
>)
>
>&がついているファイル名はForでの読込時には使用できないのでしょうか?
>ご教示の程、お願いします。

「削除対象のファイル名が書かれている」のであれば、
del "%%f"
でいいはずですが、! ! は何のことでしょう?
もしかして、「削除対象のファイル名がセットされている環境変数名が書かれている」ファイルを読むのでしょうか?
いずれにせよ、& は大丈夫なはずですが。

下記のバッチで何の問題もありません。
echo abc>"A&B.tmp"
echo A^&B.tmp>dellist.txt
dir A*.tmp
for /f "delims=" %%f in ( dellist.txt ) do ( 
del "%%f"
)
dir A*.tmp
596.
Re:&を含むファイル名の読込み
2005年07月05日(火) 03時13分
ちばっち
>>●DOS/Windowsのバージョン↓
>>Win2k/xp
>>
>>いつも掲示板を拝見させて頂いております。
>>
>>削除対象のファイル名が書かれているファイルを読み込んで削除するというバッチファイルを作っているのですが、
>>ファイル名に&が含まれている場合(例えば"A&B.txt")
>>&の前で処理が中断してしまいます。
>>
>>for /f "delims=" %%f in ( dellist.txt ) do ( 
>>del "!%%f!"
>>)
>>
>>&がついているファイル名はForでの読込時には使用できないのでしょうか?
>>ご教示の程、お願いします。
>
>「削除対象のファイル名が書かれている」のであれば、
>del "%%f"
>でいいはずですが、! ! は何のことでしょう?
>もしかして、「削除対象のファイル名がセットされている環境変数名が書かれている」ファイルを読むのでしょうか?
>いずれにせよ、& は大丈夫なはずですが。
>
>下記のバッチで何の問題もありません。
>echo abc>"A&B.tmp"
>echo A^&B.tmp>dellist.txt
>dir A*.tmp
>for /f "delims=" %%f in ( dellist.txt ) do ( 
>del "%%f"
>)
>dir A*.tmp
>

すみません。。。
処理の一部分のみ書いてしまったので、わかりにくくなってしまいました。

全体の処理としては、
対象のフォルダ内にあるファイルのタイムスタンプを見て
設定した日付(年月)と一致しないファイルを削除する。
対象のフォルダの指定は設定ファイルで行う。
というものです。

for /F "delims=" %%b in ( foldaname.txt ) do (
dir /n /a:-d /o:n %%b |find /v "2005/06"|find /v "のボリューム ラベルは"|find /v "のディレクトリ"|find /v "ボリューム シリアル番号は"|find /v "バイトの空き領域"|find /v "バイト"|find /v "のボリューム ラベルがありません。">dellist.txt
for /f "TOKENS=1,2,3,*" %%f in ( dellist.txt ) do ( 
del "%%b%%i"
)
)

このときに、対象フォルダの指定で’&’が入っていると
正常に動作しなくなってしまいます。。。。
597.
Re:&を含むファイル名の読込み
2005年07月05日(火) 16時33分
otn
>>>●DOS/Windowsのバージョン↓
>>>Win2k/xp

>処理の一部分のみ書いてしまったので、わかりにくくなってしまいました。
>
>全体の処理としては、
>対象のフォルダ内にあるファイルのタイムスタンプを見て
>設定した日付(年月)と一致しないファイルを削除する。
>対象のフォルダの指定は設定ファイルで行う。
>というものです。
>
>for /F "delims=" %%b in ( foldaname.txt ) do (
> dir /n /a:-d /o:n %%b |find /v "2005/06"|find /v "のボリューム ラベルは"|find /v "のディレクトリ"|find /v "ボリューム シリアル番号は"|find /v "バイトの空き領域"|find /v "バイト"|find /v "のボリューム ラベルがありません。">dellist.txt
> for /f "TOKENS=1,2,3,*" %%f in ( dellist.txt ) do ( 
> del "%%b%%i"
> )
>)
>
>このときに、対象フォルダの指定で’&’が入っていると
>正常に動作しなくなってしまいます。。。。

通常はforの制御変数の値に & が入っていてもそれは文の区切りと見なされないのですが、パイプにすると、& | < > などが特殊文字として解析しなおされるようです。私もつい最近気づいてblogに書いたばかりです。
http://d.hatena.ne.jp/otn/20050606/p1

%%bの値が&を含むとき、
dir %%b  → 問題無し
dir %%b|more → 問題あり
dir "%%b"|more → 問題無し

対応としては、今回のケースではfor変数を " " で囲めばいいです。あと find の羅列は findstr を使えば簡略化出来ます。

dir /n /a:-d /o:n "%%b" |find /v "2005/06"|findstr "^[0-9]">dellist.txt

別の方法としては、パイプをやめれば " " で囲まなくてもいいです。
dir /n /a:-d /o:n %%b>wk.tmp
find /v "2005/06" <wk.tmp|findstr "^[0-9]">dellist.txt
602.
Re:&を含むファイル名の読込み
2005年07月07日(木) 21時54分
ちばっち
>>>>●DOS/Windowsのバージョン↓
>>>>Win2k/xp
>
>>処理の一部分のみ書いてしまったので、わかりにくくなってしまいました。
>>
>>全体の処理としては、
>>対象のフォルダ内にあるファイルのタイムスタンプを見て
>>設定した日付(年月)と一致しないファイルを削除する。
>>対象のフォルダの指定は設定ファイルで行う。
>>というものです。
>>
>>for /F "delims=" %%b in ( foldaname.txt ) do (
>> dir /n /a:-d /o:n %%b |find /v "2005/06"|find /v "のボリューム ラベルは"|find /v "のディレクトリ"|find /v "ボリューム シリアル番号は"|find /v "バイトの空き領域"|find /v "バイト"|find /v "のボリューム ラベルがありません。">dellist.txt
>> for /f "TOKENS=1,2,3,*" %%f in ( dellist.txt ) do ( 
>> del "%%b%%i"
>> )
>>)
>>
>>このときに、対象フォルダの指定で’&’が入っていると
>>正常に動作しなくなってしまいます。。。。
>
>通常はforの制御変数の値に & が入っていてもそれは文の区切りと見なされないのですが、パイプにすると、& | < > などが特殊文字として解析しなおされるようです。私もつい最近気づいてblogに書いたばかりです。
>http://d.hatena.ne.jp/otn/20050606/p1
>
>%%bの値が&を含むとき、
>dir %%b  → 問題無し
>dir %%b|more → 問題あり
>dir "%%b"|more → 問題無し
>
>対応としては、今回のケースではfor変数を " " で囲めばいいです。あと find の羅列は findstr を使えば簡略化出来ます。
>
>dir /n /a:-d /o:n "%%b" |find /v "2005/06"|findstr "^[0-9]">dellist.txt
>
>別の方法としては、パイプをやめれば " " で囲まなくてもいいです。
>dir /n /a:-d /o:n %%b>wk.tmp
>find /v "2005/06" <wk.tmp|findstr "^[0-9]">dellist.txt
>

返信が遅くなってしまいました。。。。
教えて頂いた方法でできるようになりました。

どうもありがとうございました。
 
 


カテゴリー「バッチファイルの文法と環境変数」索引へ
カテゴリー「リダイレクト(> <)、パイプ( | )、その他の特殊記号」索引へ

 

カテゴリー一覧

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


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

資料書籍

About

2005年07月05日 22:35に投稿されたエントリーのページです。

ひとつ前の投稿は「前月名のフォルダをMM形式で作成したい」です。

次の投稿は「set /pコマンドで「構文が誤っています」と出てしまう」です。

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

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