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

このQ&Aのポイント
  • コマンドプロンプトでエラーチェック処理を実施したいのです。
  • "C:\データ転送"という場所に"A-日付.txt"というファイルが1個だけ存在していたら正常に処理を実施します。
  • やりたいことは上記処理を実施する前に以下のエラーチェックを入れたいのです。"A.-日付txt"というファイルが"C:\データ転送"という場所に0個の場合は"ファイルがありません"と表示して処理を終了し、2個以上の場合は"同名のファイルが2つ以上あります"と表示して処理を終了します。
回答を見る
  • ベストアンサー

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

お世話になります。 コマンドプロンプトでエラーチェック処理を実施したいのです。 "C:\データ転送"という場所に "A-日付.txt"というファイルが1個だけ存在していたら正常に処理を実施。 ちなみに日付部分は色々な日付が入ります。 やりたいことは上記処理を実施する前に以下のエラーチェックを入れたいのです。 "A.-日付txt"というファイルが"C:\データ転送"という場所に 0個の場合、”ファイルがありません”と表示して処理を終了。 2個以上の場合、”同名のファイルが2つ以上あります”と表示して処理を終了。 どなたかご教授いただけますでしょうか? よろしくお願い致します。 環境 Windows XP SP3

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

  • ベストアンサー
  • luka3
  • ベストアンサー率74% (301/404)
回答No.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 正常な処理 でいいと思います。

yakkun2338
質問者

お礼

luka3さん、何度も何度もご対応ありがとうございます! ご教授いただきましたロジックで実現しました!!(涙) 本当に、本当にご丁寧に何度もご対応いただきまして誠にありがとうございました!! またA-日付txt B-日付txt C-日付txtの対応パターンまでご配慮いただきまして本当にありがとうございます。将来的な運用を考えますと、こちらの制御が必要になりそうですので、本当に助かりました。 超初心者の私に対して何度もご丁寧にご対応いただきましたluka3さん本当にありがとうございました! 私も勉強します! ありがとうございました。

その他の回答 (4)

  • luka3
  • ベストアンサー率74% (301/404)
回答No.4

もしかして、バッチファイルもしくはそのショートカットにtxtファイルをドラッグ&ドロップしていませんでしょうか? その場合バッチファイルに渡る引数(%1)がフルパスになってしまいます。 であれば1行目を次のように変えて下さい。 for /f "delims=- tokens=1" %%i in ("%~nx1") do set V=%%i echo off しなければ途中経過が表示されますので、何が問題になっているか確認するようにしてください。 解決できない場合はこの途中経過を公開できる範囲で提供してもらえると助かります。

yakkun2338
質問者

補足

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
  • ベストアンサー率74% (301/404)
回答No.3

変更の必要はありません。 (そもそも-の前の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
質問者

補足

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
  • ベストアンサー率74% (301/404)
回答No.2

これでどうでしょうか。バッチファイルです。 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
質問者

補足

luka3さん、早速のご連絡ありがとうございました。 ご連絡が遅くなりまして申し訳ございませんでした。 ご教授いただきました方法でうまく処理できました! 申し訳ありませんがもう1つご教授いただきたいのです。 判定するファイル名をABCD-20120304.txtのように"-"の前の文字列を以前の"A"という1文字から”ABCD"という4文字に増やした場合、ご教授いただいたロジックを"tokens=1-4"と変更しましたがうまくいきませんでした。"-"の前の文字数をABCDに変更した場合、ロジックのどこをいじれば良いのか分からず悩んでおります。 何度も申し訳ありませんが、ご教授いただけますでしょうか?

  • chie65535
  • ベストアンサー率43% (8524/19375)
回答No.1

以下、コマンドプロンプトで実行するバッチファイルの例。 --------- IF NOT EXIST C:\データ転送\A.-日付txt GOTO ERROR ECHO ファイルが1つあったので正常な処理をします GOTO END :ERROR ECHO ファイルがありません :END ECHO 処理を終了します --------- >2個以上の場合、”同名のファイルが2つ以上あります”と表示して処理を終了。 1つのフォルダに完全に同名のファイルを2つ以上保存する事は不可能です。 コピーまたは作成時に、同名のファイルがあると、既存のファイルに上書きされ「常に1つしかない」と言う状態になります。 なので「2個以上の場合」は考える必要がありません。

yakkun2338
質問者

補足

hie65535さん、早速のご連絡ありがとうございました! ご教授いただきました方法でうまく処理できました! 大変助かりました。 私の言い方が良くありませんでしたが「2個以上」というのは全くの同名ファイルではなくて、A-日付.txtの日付部分が異なる名前のファイルが複数存在してしまうのを防ぎたかったのです。 以下例の様な事態の場合にエラーになるようにしたかったのです。 例) A-20120303.txt A-20120304.txt A-20120305.txt もし可能でございましたら、上記のチェックが出来る方法がありましたらご教授いただけませんでしょうか。

関連するQ&A

  • コマンドプロンプト copyができません

    こんにちわ。 コマンドプロンプトのcopyコマンドについて質問させていただきます。 下記(1)~(4)処理内容のバッチファイルを作成しました。 デスクトップにある転送データ.txtを(2)、(3)、(4)の各workフォルダへコピーする処理です. (2)、(3)には正常にコピーされますが、なぜか(4)だけコピーされません。 (1)cd C:\Documents and Settings\XXX\デスクトップ (2)copy 転送データ.txt D:\work (3)copy 転送データ.txt C:\work (4)copy 転送データ.txt C:\Documents and Settings\XXX\デスクトップ\work どなたかご教授いただけますでしょうか? 環境 WindowsXP SP3

  • コマンドプロンプトでバッチをつくりたいです

    こんにちは。コマンドプロンプト初心者です。 一通り調べたのですが諸事情により時間がないため、 ご存知の方、どうが教えてください。 ファイルをある特定のフォルダ下にコピーするのですが、 パラメータによってコピー元のファイルを変えたいです。 引数を渡すことができません。 ---------------------------------------------- 【コード】 IF %1%=="" GOTO ERROR IF %1%==1 GOTO 処理1 IF %1%==2 GOTO 処理2 :処理1 CD C:処理1 COPY C:処理1\parm.txt C:コピー先フォルダ :処理2 CD C:処理2 COPY C:処理2\parm.txt C:コピー先フォルダ :ERROR ---------------------------------------------- 実は、一番やりたい事は、バッチファイル起動時に ダイアログボックスを表示し、そこにパラメータを入れて 渡すことができたら最高なのですが。 よろしくお願いいたします。

  • コマンドプロンプトでファイル名変更

    コマンドプロンプトを使って C:\test.txt というファイルを今日の日付、例えば2005年3月25日だったら、 C:\20050325.txt に名前を変更するにはどのように記述したらよいでしょうか?

  • コマンドプロンプトで簡単なファイルの読み込み

    ファイルAの場所 C:\file.txt ファイルBの場所 D:\file.txt それぞれのファイルには一行の文字が書かれています。 バッチファイルを使って、この二つのファイルを読み込み、内容が同じであれば、"same"をecho、そうでなければファイルAをファイルBに上書きするというバッチを作りたいのですが、コマンドプロンプトは使ったことがないので、よくわかりません。 調べてみましたが、for /fを使うのでしょうか?それぞれのファイルは一行しか文字を含まないので、もっと簡単にできそうな気もするんですけどどうなんでしょう。

  • コマンドプロンプトでわからないことがあります

    例えばtxtファイルをドロップするとある動作をするバッチファイルAがあります。 特定のアドレスにあるtxtをドロップせずにAの操作を実行出来るバッチファイルBを、 Aのバッチを呼び出す形で作りたいです。 パッチファイルBを下のような感じで書いてみました。 ---------------------------------------- set BAT=Aのbatファイルのパス set TXT=C:\*.txt call %BAT% %TXT% ---------------------------------------- これでC直下にある全てtxtはAのバッチファイルである動作をするだろうと思ったのですが、 Aバッチファイルには『C:\*.txt』とそのまま読み込まれてしまいました。 *がワイルドカードとして使われていない感じです。 なぜでしょう?どうしたらいいでしょうか。

  • バッチファイルについて質問です

    フォルダ内にA、B、Cと言ったテキストファイルがあります。 Aファイルだったら、日付-A.txtといったファイルのリネーム処理を実施するにはどのように記載すればいいのでしょうか? ※現在、ファイルのリネーム、日付を取得するところまで出来ています。 宜しくお願いします。

  • コマンドプロンプトでのファイル操作について

    コマンドプロンプトでのファイル操作について、ご存知のかたどうか教えてください。 a.txt b.txtという2つのファイルがあるとします。 <a.txtの内容> 1111 2222 3333 <b.txtの内容> aaaa bbbb cccc 上記の2つのファイルを読み取りc.txtというファイルへ以下のように 出力したいのですが、コマンドプロンプト(batでも問題ありません) にてできるのでしょうか? <c.txtの内容> 1111,aaaa 2222,bbbb 3333,cccc ご教授のほど、宜しくお願いします。

  • エクセル:マクロでの同名ファイル検索

    お世話になります。 あるフォルダの中に、たくさんフォルダが入っています。 子フォルダのファイルを全て親フォルダに移すのですが、同名ファイルがある可能性があります。 同名ファイルは枝番をつけるなどして処理するのですが、あらかじめ同名ファイルがあるかどうかを調べたいのです。 親フォルダの中にエクセルを入れておき、マクロの実行の結果、エクセルのシートに同名ファイルの情報を表示できればと思っています。 例)もし同名ファイルがあった場合、 まずセルA1にファイル名、B1に拡張子を表示する。123.xlsの場合 A1に123 B1に.xls そしてそのファイルが入っているフォルダ名をB2以降のB列に表示する。 3つのフォルダにA1のファイル名のデータがあれば、B2,B3,B4にそのフォルダ名が表示される。 もちろん同名ファイルが1組とは限りません。 2つ目以降はB列のフォルダ名が入った下の行のA列(上の例だとA5)にファイル名が入る。 この繰り返しです。 また、もし1つの同名ファイルがなかった場合は、A1に「同名ファイルなし」と表示させます。 ちなみに重複の場合の枝番の付け方に規則性がないため手作業で行いますが、枝番をつけて同名ファイルを無くした あとにまとめて親フォルダに全データを移すこともマクロで可能ならアドバイスください。 フォルダ構成は1つの親フォルダに対して複数の子フォルダで、孫フォルダはありません。 OSはWinXP、Excelは2002です。 よろしくお願いします。

  • コマンドプロンプト

    コマンドプロンプトで下記の処理がしたいです。 複数のフォルダに同じファイル名(INDEX.txt)が存在しております。 フォルダA   INDEX.txt フォルダB   INDEX.txt ... フォルダZ   INDEX.txt INDEX.txtの中身以下の状態です。 (フォルダBならAの部分がB)  0001,フォルダA,  0002,フォルダA,  ...  0100,フォルダA, これに対して一括の処理で下記のように1行目に「0000」を書き加えたいです。  0000  0001,フォルダA,  0002,フォルダA,  ...  0100,フォルダA, どなたか、詳しい方お教え頂ければと思います。 宜しくお願い致します。

  • ファイル移動処理(コマンドプロンプト batファイル)

    ファイル移動処理(コマンドプロンプト batファイル) .batファイルでファイル名に日付がついたファイル(例:yyyymmdd_test.txt)の最新日付から2世代前のファイルまでをディレクトリに移動するような処理を記述したいのですが、やり方がわかりません。 例) 20100924_test.txt →移動対象外 20100925_test.txt →移動対象外 20100926_test.txt →移動対象 20100927_test.txt →移動対象 20100928_test.txt →移動対象 今、この下記の様に記述をしていますが意図した処理になりません。 どなたか助言を頂けないでしょうか? -------------------------------------------------------- mkdir temp set num=0 for %%f in (????????_test.txt) do ( set /a num+=1 if %num%==1 move %f% \temp\%f if %num%==2 move %f% \temp\%f if %num%==3 move %f% \temp\%f )

専門家に質問してみよう