- ベストアンサー
コマンドプロンプトで同名ファイルをチェック
- コマンドプロンプトでエラーチェック処理を実施したいのです。
- "C:\データ転送"という場所に"A-日付.txt"というファイルが1個だけ存在していたら正常に処理を実施します。
- やりたいことは上記処理を実施する前に以下のエラーチェックを入れたいのです。"A.-日付txt"というファイルが"C:\データ転送"という場所に0個の場合は"ファイルがありません"と表示して処理を終了し、2個以上の場合は"同名のファイルが2つ以上あります"と表示して処理を終了します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
やりたいことがようやくわかりました。 こちらの意図としては、「転送.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 正常な処理 でいいと思います。
その他の回答 (4)
- luka3
- ベストアンサー率72% (424/583)
もしかして、バッチファイルもしくはそのショートカットにtxtファイルをドラッグ&ドロップしていませんでしょうか? その場合バッチファイルに渡る引数(%1)がフルパスになってしまいます。 であれば1行目を次のように変えて下さい。 for /f "delims=- tokens=1" %%i in ("%~nx1") do set V=%%i echo off しなければ途中経過が表示されますので、何が問題になっているか確認するようにしてください。 解決できない場合はこの途中経過を公開できる範囲で提供してもらえると助かります。
補足
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-"で始まる転送ファイルを用意して下さい!! 本当に何度も申し訳ありません・・。
- luka3
- ベストアンサー率72% (424/583)
変更の必要はありません。 (そもそも-の前の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 という具合に追加すればいいです。
補足
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 処理を終了します
- luka3
- ベストアンサー率72% (424/583)
これでどうでしょうか。バッチファイルです。 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つ以上あります
補足
luka3さん、早速のご連絡ありがとうございました。 ご連絡が遅くなりまして申し訳ございませんでした。 ご教授いただきました方法でうまく処理できました! 申し訳ありませんがもう1つご教授いただきたいのです。 判定するファイル名をABCD-20120304.txtのように"-"の前の文字列を以前の"A"という1文字から”ABCD"という4文字に増やした場合、ご教授いただいたロジックを"tokens=1-4"と変更しましたがうまくいきませんでした。"-"の前の文字数をABCDに変更した場合、ロジックのどこをいじれば良いのか分からず悩んでおります。 何度も申し訳ありませんが、ご教授いただけますでしょうか?
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
以下、コマンドプロンプトで実行するバッチファイルの例。 --------- IF NOT EXIST C:\データ転送\A.-日付txt GOTO ERROR ECHO ファイルが1つあったので正常な処理をします GOTO END :ERROR ECHO ファイルがありません :END ECHO 処理を終了します --------- >2個以上の場合、”同名のファイルが2つ以上あります”と表示して処理を終了。 1つのフォルダに完全に同名のファイルを2つ以上保存する事は不可能です。 コピーまたは作成時に、同名のファイルがあると、既存のファイルに上書きされ「常に1つしかない」と言う状態になります。 なので「2個以上の場合」は考える必要がありません。
補足
hie65535さん、早速のご連絡ありがとうございました! ご教授いただきました方法でうまく処理できました! 大変助かりました。 私の言い方が良くありませんでしたが「2個以上」というのは全くの同名ファイルではなくて、A-日付.txtの日付部分が異なる名前のファイルが複数存在してしまうのを防ぎたかったのです。 以下例の様な事態の場合にエラーになるようにしたかったのです。 例) A-20120303.txt A-20120304.txt A-20120305.txt もし可能でございましたら、上記のチェックが出来る方法がありましたらご教授いただけませんでしょうか。
お礼
luka3さん、何度も何度もご対応ありがとうございます! ご教授いただきましたロジックで実現しました!!(涙) 本当に、本当にご丁寧に何度もご対応いただきまして誠にありがとうございました!! またA-日付txt B-日付txt C-日付txtの対応パターンまでご配慮いただきまして本当にありがとうございます。将来的な運用を考えますと、こちらの制御が必要になりそうですので、本当に助かりました。 超初心者の私に対して何度もご丁寧にご対応いただきましたluka3さん本当にありがとうございました! 私も勉強します! ありがとうございました。