みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

バッチファイル Windows2000 コマンド

いつも大変お世話になっております。

Windows2000 SP4環境にて下記のバッチファイルがあります。

コード------------------------------------------------------

FOR /F %%i in ('DIR C:\test_201012??.xls /B') DO SET $FILE=%%i

COPY C:\%$FILE% D:\test\OK.xls

コード------------------------------------------------------

Cドライブ直下の【test_201012??.xls】に一致するファイルを探して
変数【$FILE】に格納して、コピー処理するという単純なバッチファイルです。
※ちなみに【test_201012】という文字列のファイルは絶対に1ファイルしかない。

WindowsXP SP3環境では問題無く動作しますが、
上記バッチファイルをWindows2000 SP4環境で実行すると以下のようなエラーが発生します。

-----------------〈以下コマンドプロンプト結果抜粋〉-----------------
>SET $FILE=ドライブ
>SET $FILE=ボリューム
>SET $FILE=C:\
>SET $FILE=2010/12/10
>SET $FILE=1
>SET $FILE=0
>COPY C:\0 D:\test\OK.xls
指定されたファイルが見つかりません。
----------------------------------------------------------------

2010/12/10は今回の対象ファイルの【test_201012??.xls】で更新日時と同一でした。
※ちなみにファイル名は【test_20101210.xls】です。

一見ファイル名【test_20101210.xls】を検索しているように見えますが、
変数【$FILE】に複数回いろいろなものが格納され、最終的に【0】が$FILEに格納されてしまい、
その結果、COPY元ファイル名が【0】になって未存在ファイルとしてエラーとなっております。

なぜうまくいかないのでしょうか?

Windows2000環境内のFOR構文やDIRコマンドに何かしらの制限があるのでしょうか?

もしくはワイルドカードの制限でしょうか?
ちなみに【??】を【*】に変更しても結果は同じでした。

別の方法でないとうまくいかないのでしょうか?
このバッチファイルのみで処理を完結したいのです。

何か良い方法があるでしょうか?

ご存知の方がいれば、ご教授願いますでしょうか?

以上、何卒宜しくお願い致します。

投稿日時 - 2010-12-11 09:20:19

QNo.6376846

困ってます

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

#3の補足について。藁かもしれませんが。

COPY C:\test_201012??.xls /B D:\test\OK.xls

/Bを付加してしてみてください。バイナリ転送となりテキストの終端コードがあってもサイズ分コピーされるはずです。

投稿日時 - 2010-12-12 20:03:14

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

はじめはNo.1さんの回答と同じく /B が抜けているのかと思いましたが、Windows2000ということで可能性としてありえるのが、for文のバグです。

beckfloydさんが例示しているバッチの括弧内 'DIR C:\test_201012??.xls /B' のところのファイル名等、実際のバッチと変えていませんか?さらに本当のバッチには漢字やひらがななどの2バイト系の文字が入っていませんか?

以下のページをご参照ください。

Windows2000 のコマンドプロンプトでは in ('  ') の中で2バイト文字を使うとその文字数だけコマンドの後が削られるようです。

http://fpcu.on.coocan.jp/dosvcmd/bbs/log/cat3/for_in_do/4-0138.html
http://fpcu.on.coocan.jp/dosvcmd/bbs/log/cat3/for_in_do/3-0471.html

もしtest_201012??.xlsに一致するファイルが1つしかないのなら、for分は省略して、
COPY C:\test_201012??.xls D:\test\OK.xls
だけでもいいのではないかと思います。

投稿日時 - 2010-12-12 16:50:01

補足

pita-gora さん

ご回答ありがとうございます。

以下回答致します。

>beckfloydさんが例示しているバッチの括弧内 'DIR C:\test_201012??.xls /B' のところのファイ>ル名等、実際のバッチと変えていませんか?さらに本当のバッチには漢字やひらがななどの2バイト系
>の文字が入っていませんか?
はい、全角文字が1~2文字入っております。
半角文字で質問してしまって申し訳ございません。

>もしtest_201012??.xlsに一致するファイルが1つしかないのなら、for分は省略して、
>COPY C:\test_201012??.xls D:\test\OK.xls
最初実施致しました。
しかしながら、80KBあったサイズが1KBでコピーされるという現象が発生しました。
※ちなみに【*】で実施しても結果は同じでした。
 尚、XPでは【?】【*】はOKでした。
原因不明なので、他の方法で実施しようとして今回のような問題にいきつきました。

宜しくお願い致します。

投稿日時 - 2010-12-12 17:19:05

ANo.2

なぜにそのようにしたのか不明です。

普通 IF文を使ったり、Copyコマンドでも、同じようにワイルドカードを使ってコピーするだけすむはずですが?

http://itpro.nikkeibp.co.jp/free/NT/WinKeyWord/20040805/1/copy.shtml

Copyのオプションで/Yで非対話モードになり、エラーを表示させたくなければ

> NUL

or

> NUL 2>&1

とすれば表示されません。確か2000でも If 文(exist)とcopyでワイルドカード(* ?)が機能したと思いますが?
これらは、DOSの基本操作です。

OKファイルが存在すれば、コピー元があり成功したと言う事です。

これ以外にも、find, findstrがありますが。目的のことはcopy文1行ですみます

投稿日時 - 2010-12-12 00:15:54

ANo.1

確かに上記のコードであればWindows2000SP4でも動作しました。

ちょっと意地悪して、DIRコマンドの「/B」を削除したら上記の結果のようになりました。

きちんとコーディングされているか(機能しているか)確認してみてはいかがでしょうか。

投稿日時 - 2010-12-11 09:58:45

あなたにオススメの質問