解決済み

コマンドプロンプトで同名ファイルをチェック

  • 困ってます
  • 質問No.7337951
  • 閲覧数1251
  • ありがとう数1
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 78% (315/402)

お世話になります。

コマンドプロンプトでエラーチェック処理を実施したいのです。

"C:\データ転送"という場所に
"A-日付.txt"というファイルが1個だけ存在していたら正常に処理を実施。
ちなみに日付部分は色々な日付が入ります。


やりたいことは上記処理を実施する前に以下のエラーチェックを入れたいのです。

"A.-日付txt"というファイルが"C:\データ転送"という場所に
0個の場合、”ファイルがありません”と表示して処理を終了。
2個以上の場合、”同名のファイルが2つ以上あります”と表示して処理を終了。

どなたかご教授いただけますでしょうか?
よろしくお願い致します。

環境 Windows XP SP3

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

  • 回答No.5

ベストアンサー率 77% (177/228)

やりたいことがようやくわかりました。
こちらの意図としては、「転送.bat ABCD-120306.txt」で実行するという形でしたので、改めて書き直しました。

cd C:\データ転送
for /f %%f in ('dir /b *-*.txt') do (
for /f "delims=- tokens=1" %%i in ("%%f") do (
for /f %%a in ('dir /b %%i-*.txt^|find /c /v ""') do (
if not "%%a"=="1" (
echo %%i のファイルが2つ以上あります
dir /b %%i-*.txt
goto :EOF
) ) ) )
for /f %%a in ('dir /b *-*.txt^|find /c /v ""') do (
if "%%a"=="0" (
echo エラー !! "A-"で始まる転送ファイルを用意して下さい!!
goto :EOF
) )
echo 正常な処理をする

簡単に解説しますと、
2行目で *-*.txt のリストを取得し、3行目でファイル名を-の前後で分解、
4行目でABCD-*.txtの個数をカウントし2つ以上ならメッセージと一覧を表示して終了、
10行目でファイルが1つもない場合を確認し、OKなら15行目で正常な処理をする、
となります。

A-日付txt の他に B-日付txt C-日付txt もあって、それぞれ1つの場合も対応できるようにしていますが余計なお世話だったかな?
A-日付txt のみでいいならもっと単純で

cd C:\データ転送
for /f %%a in ('dir /b A-*.txt^|find /c /v ""') do (
if not "%%a"=="1" (
echo Aのファイルが2つ以上あります
dir /b A-*.txt
goto :EOF
)
if "%%a"=="0" (
echo エラー !! "A-"で始まる転送ファイルを用意して下さい!!
goto :EOF
) )
echo 正常な処理

でいいと思います。
お礼コメント
yakkun2338

お礼率 78% (315/402)

luka3さん、何度も何度もご対応ありがとうございます!

ご教授いただきましたロジックで実現しました!!(涙)
本当に、本当にご丁寧に何度もご対応いただきまして誠にありがとうございました!!

またA-日付txt B-日付txt C-日付txtの対応パターンまでご配慮いただきまして本当にありがとうございます。将来的な運用を考えますと、こちらの制御が必要になりそうですので、本当に助かりました。

超初心者の私に対して何度もご丁寧にご対応いただきましたluka3さん本当にありがとうございました!
私も勉強します!
ありがとうございました。
投稿日時 - 2012-03-07 15:08:49
Be MORE 7・12 OK-チップでイイコトはじまる

その他の回答 (全4件)

  • 回答No.4

ベストアンサー率 77% (177/228)

もしかして、バッチファイルもしくはそのショートカットにtxtファイルをドラッグ&ドロップしていませんでしょうか?
その場合バッチファイルに渡る引数(%1)がフルパスになってしまいます。

であれば1行目を次のように変えて下さい。
for /f "delims=- tokens=1" %%i in ("%~nx1") do set V=%%i

echo off しなければ途中経過が表示されますので、何が問題になっているか確認するようにしてください。
解決できない場合はこの途中経過を公開できる範囲で提供してもらえると助かります。
補足コメント
yakkun2338

お礼率 78% (315/402)

uka3さん、おはようございます。
本当に何度も申し訳ございません。

ご指摘された様に、txtをドラッグしたりという事はしていません。
もう一度、現在の状況をご説明します。

「C:\データ転送」というフォルダに『ABCD-120306.txt』、『ABCD-120307.txt』という2つのファイルがあります。
この状態で「C:\データ転送\system」のフォルダにある「転送.bat」をダブルクリックして処理を実施したいと思います。

この時に「C:\データ転送」フォルダに、ABCD-日付で始まるファイルが2つ以上ある場合はエラーとして処理をしないようにしたいのです。
つまりABCD-日付.txtファイルが1つの時だけ処理を実施したいと思っています。

以下に「転送.bat」を動かしたときの結果を記述いたします。
↓↓↓
C:\データ転送\system>cd C:\データ転送
C:\データ転送>for /F "delims=- tokens=1" %i in ("") do set V=%i
C:\データ転送>for /F %a in ('dir /b C:\データ転送\-*.txt|find /c /v ""')
do set L=%a
ファイルが見つかりません
C:\データ転送>set L=0
C:\データ転送>if 0 == 0 goto error
C:\データ転送>echo エラー !! "A-"で始まる転送ファイルを用意して下さい!!
エラー !! "A-"で始まる転送ファイルを用意して下さい!!

本当に何度も申し訳ありません・・。
投稿日時 - 2012-03-07 08:43:08
  • 回答No.3

ベストアンサー率 77% (177/228)

変更の必要はありません。
(そもそも-の前の1文字限定という作り方はしておりません)

for /f "delims=- tokens=1" %%i in ("%1") do set V=%%i を解説しますと、
1番目の引数(%1)を '-' を区切り文字として分割し、その1番目(つまり '-' の前)の文字列を %i に代入し、Vに%iをセットせよ、
という意味になります。
ここでtokens=1-4とすると、%iに - の前の文字列、%jに - の後の文字列、%k・%lに空の文字列?がセットされますが、%iの中身は結局変わらないので、このバッチは機能するはずです。
他に変更した部分はないですか?

1つ私が忘れたのは、ファイルが1つだけの時に正常な処理をする実施という部分ですが、最後に
if %L%==1 call 正常な処理.bat
という具合に追加すればいいです。
補足コメント
yakkun2338

お礼率 78% (315/402)

uka3さん、何度もご対応ありがとうございます。

また細かなご説明誠に感謝いたします。
本当に知識不足で申し訳ございません。。、

本件ですが、私側で変更した点は以下の様にgoto erroを追加しました。
if %L%==0 goto error
if %L%==2 goto error

以下私の環境でのロジックとなります。
何かおかしな点がありますでしょうか?申し訳ありません。。

cd C:\データ転送
for /f "delims=- tokens=1" %%i in ("%1") do set V=%%i
for /f %%a in ('dir /b C:\データ転送\%V%-*.txt^|find /c /v ""') do set L=%%a
if %L%==0 goto error
if %L%==2 goto error
echo ファイルが1つあったので正常な処理をします
**処理**
echo 処理が正常に終わりました。
goto end
:error
echo エラー !! "A-"で始まるファイルを用意して下さい!!
:end
echo 処理を終了します
投稿日時 - 2012-03-06 16:09:49
  • 回答No.2

ベストアンサー率 77% (177/228)

これでどうでしょうか。バッチファイルです。

for /f "delims=- tokens=1" %%i in ("%1") do set V=%%i
for /f %%a in ('dir /b C:\データ転送\%V%-*.txt^|find /c /v ""') do set L=%%a
if %L%==0 echo ファイルがありません
if %L%==2 echo 同名のファイルが2つ以上あります
補足コメント
yakkun2338

お礼率 78% (315/402)

luka3さん、早速のご連絡ありがとうございました。

ご連絡が遅くなりまして申し訳ございませんでした。
ご教授いただきました方法でうまく処理できました!

申し訳ありませんがもう1つご教授いただきたいのです。
判定するファイル名をABCD-20120304.txtのように"-"の前の文字列を以前の"A"という1文字から”ABCD"という4文字に増やした場合、ご教授いただいたロジックを"tokens=1-4"と変更しましたがうまくいきませんでした。"-"の前の文字数をABCDに変更した場合、ロジックのどこをいじれば良いのか分からず悩んでおります。
何度も申し訳ありませんが、ご教授いただけますでしょうか?
投稿日時 - 2012-03-05 23:05:33
  • 回答No.1

ベストアンサー率 43% (7463/17137)

以下、コマンドプロンプトで実行するバッチファイルの例。
---------
IF NOT EXIST C:\データ転送\A.-日付txt GOTO ERROR
ECHO ファイルが1つあったので正常な処理をします
GOTO END
:ERROR
ECHO ファイルがありません
:END
ECHO 処理を終了します
---------

>2個以上の場合、”同名のファイルが2つ以上あります”と表示して処理を終了。

1つのフォルダに完全に同名のファイルを2つ以上保存する事は不可能です。

コピーまたは作成時に、同名のファイルがあると、既存のファイルに上書きされ「常に1つしかない」と言う状態になります。

なので「2個以上の場合」は考える必要がありません。
補足コメント
yakkun2338

お礼率 78% (315/402)

hie65535さん、早速のご連絡ありがとうございました!

ご教授いただきました方法でうまく処理できました!
大変助かりました。

私の言い方が良くありませんでしたが「2個以上」というのは全くの同名ファイルではなくて、A-日付.txtの日付部分が異なる名前のファイルが複数存在してしまうのを防ぎたかったのです。

以下例の様な事態の場合にエラーになるようにしたかったのです。
例) A-20120303.txt
A-20120304.txt
A-20120305.txt

もし可能でございましたら、上記のチェックが出来る方法がありましたらご教授いただけませんでしょうか。
投稿日時 - 2012-03-02 15:54:20
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
このQ&Aのテーマ

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

特集


より良い社会へ。感謝経済プロジェクト始動

ピックアップ

ページ先頭へ