• 締切済み

バッチファイル フォルダ存在 確認

いつも大変御世話になっております。 WindowsXP SP2に【D:\test\bat】フォルダに【test.bat】があります。 上記バッチファイルは以下のようになっています。 コード------------------------------------------------ rem --- 時間変数 --- set yyyy=%date:~-10,2% set yy=%date:~-8,2% set mm=%date:~-5,2% set dd=%date:~-2,2% set YMD=%date:~-8,10% set HHMMSS=%time:~0,8% set FILE_DATE=%date:~-10,4%%date:~-5,2%%date:~-2,2%%TIME:~0,2%%TIME:~3,2% set FILE_DATE=%FILE_DATE: =0% rem --- フォルダ変数 --- set log=D:\test\drive_xcopy\log set INP_DIR=D:\test\drive_xcopy\in set OUT_DIR=D:\test\drive_xcopy\out\ rem --- ファイル変数 --- set logName=log.txt echo "%YMD%","%HHMMSS%","FOLDER.bat","処理開始" >> %log%\%logName% REM フォルダコピー XCOPY "%INP_DIR%" "%OUT_DIR%" /e /Y >> %log%\%logName% echo "%YMD%","%HHMMSS%","FOLDER.bat","処理終了" >> %log%\%logName% コード------------------------------------------------ 単純に【D:\test\drive_xcopy\in\】内のすべてのフォルダを 【D:\test\drive_xcopy\out\】内にコピーしています。 ちなみに、、【D:\test\drive_xcopy\in\】フォルダには100個フォルダがあります。 実現したい事は、コピー対象となる100個フォルダがちゃんとコピーされ、 コピー先にすべて確実存在しているかを【コピー元⇔コピー先】とで 1つ1つマッチング処理したいのです。 すべて存在していれば、上記ログファイルに 100フォルダすべてが存在しています。 と書き込み、 1つでも存在していなければ、上記ログファイルに ○○○フォルダがコピー先に存在していません。 それ以外は存在しています。 と書き込むような処理を実現したいのです。 コピー先に存在していないのが複数であれば 下記のようなログメッセージを書き込みたいです。 ログメッセージ例----------------------- ○○○フォルダがコピー先に存在していません。 ×××フォルダがコピー先に存在していません。 それ以外は存在しています。 ログメッセージ例----------------------- For文とIF文をうまく使い、フォルダを変数で順に格納してマッチングするような 作成になると思いますが、難しくて苦戦しています。 方法をご存知の方がいれば、ご教授願いますでしょうか? ※サンプルがあれば、光栄です。 宜しくお願い致します。

みんなの回答

  • Cupper
  • ベストアンサー率32% (2123/6444)
回答No.1

if exist ~

関連するQ&A

  • バッチファイル 複数条件判定方法

    いつも大変御世話になっております。 WindowsXP SP2に【D:\test\bat】フォルダに【test.bat】があります。 上記バッチファイルは以下のようになっています。 コード------------------------------------------------ rem --- フラグ変数 --- set OK=0 set NG=1 rem --- 初期化 --- set FLAG_A=%OK% set FLAG_B=%OK% rem --- 時間変数 --- set yyyy=%date:~-10,4% set yy=%date:~-8,2% set mm=%date:~-5,2% set dd=%date:~-2,2% set YMD=%date:~-8,10% set HHMMSS=%time:~0,8% set FILE_DATE=%date:~-10,4%%date:~-5,2%%date:~-2,2%%TIME:~0,2%%TIME:~3,2% set FILE_DATE=%FILE_DATE: =0% rem --- 存在ファイル格納フォルダ変数 --- set SERCH_DIR1=D:\sample1\ set SERCH_DIR2=D:\sample2\ rem --- ログフォルダ変数 --- set LOG_DIR1=D:\sampleLOG rem --- ログファイル変数 --- set LOG_FILE1=LOG.txt rem --- 検索対象ファイル変数 --- set SERCH_FILE1=sample1.txt set SERCH_FILE2=sample2.txt REM <STEP1> REM %SERCH_FILE1%存在チェック開始=============================================== echo %yyyy%%mm%/%dd% %HHMMSS% >> %LOG_DIR1%\%LOG_FILE1% IF EXIST %SERCH_DIR1%\%SERCH_FILE1% goto YES1 ECHO ON echo %SERCH_FILE1%が存在していません。調査して下さい。 >> %LOG_DIR1%\%LOG_FILE1% ECHO ON set FLAG_A=%NG% goto NEXT_SERCH_FILE :YES1 ECHO ON echo %SERCH_FILE1%が存在しています。 >> %LOG_DIR1%\%LOG_FILE1% ECHO OFF REM %SERCH_FILE1%存在チェック終了=============================================== PAUSE :NEXT_SERCH_FILE REM <STEP2> REM %SERCH_FILE2%存在チェック開始=============================================== echo %yyyy%%mm%/%dd% %HHMMSS% >> %LOG_DIR1%\%LOG_FILE1% IF EXIST %SERCH_DIR1%\%SERCH_FILE2% goto YES2 ECHO ON echo %SERCH_FILE2%が存在していません。調査して下さい。 >> %LOG_DIR1%\%LOG_FILE1% ECHO ON set FLAG_B=%NG% goto HANTEI :YES2 ECHO ON echo %SERCH_FILE2%が存在しています。 >> %LOG_DIR1%\%LOG_FILE1% ECHO OFF REM %SERCH_FILE2%存在チェック終了=============================================== PAUSE REM <終了処理>================================================================== :HANTEI ECHO ON echo %FLAG_A% >> %LOG_DIR1%\%LOG_FILE1% echo %FLAG_B% >> %LOG_DIR1%\%LOG_FILE1% PAUSE IF FLAG_A == %OK% IF FLAG_B == %OK% ( echo %yyyy%/%mm%/%dd% %HHMMSS% 正常終了 >> %LOG_DIR1%\%LOG_FILE1% ) ELSE ( echo %yyyy%/%mm%/%dd% %HHMMSS% 異常終了 >> %LOG_DIR1%\%LOG_FILE1% ) PAUSE コード------------------------------------------------ 一番最後の判定処理がうまく動作しません。 ※両フラグ(FLAG_AとFLAG_B)が0の時に正常終了のログをはきだし、どちらかが0ではない場合は異常終了のログをはきだす仕組みにしたいのです。 プログラムのどこに問題があるのでしょうか? バッチファイルにお詳しい方、ご教授願いますでしょうか? ※サンプルがあれば、光栄です。 何卒、宜しくお願い致します。

  • バッチファイル 2つのログに出力 短縮版

    お世話になっております。 WindowsXP環境にて下記のバッチファイルがあります。 コード-------------------------------------------------------------------------------- rem === 変数設定 =============================================================== rem --- 時間変数 --- set yyyy=%date:~-10,2% set yy=%date:~-8,2% set mm=%date:~-5,2% set dd=%date:~-2,2% set HH=%TIME:~0,2% set MM2=%TIME:~3,2% set SS=%TIME:~6,2% rem --- フォルダ変数 --- set LOG_DIR1=D:\test rem --- ファイル変数 --- set LOG_FILE1=LOG.txt set LOG_FILE2=LOG_ALL.txt set LOG_FILENAME1=%LOG_DIR1%\%LOG_FILE1% set LOG_FILENAME2=%LOG_DIR1%\%LOG_FILE2% set BAT_FILE1=test.bat rem コマンド拡張機能有効化 setlocal ENABLEEXTENSIONS rem === 変数設定 =============================================================== REM <開始処理>=============== call :TIME echo %BAT_FILE1% 処理日 = %yyyy%%yy%/%mm%/%dd% 処理開始時間= %HH%:%MM2%:%SS%>> %LOG_FILENAME1% echo. >> %LOG_FILENAME1% echo %BAT_FILE1% 処理日 = %yyyy%%yy%/%mm%/%dd% 処理開始時間= %HH%:%MM2%:%SS%>> %LOG_FILENAME2% echo. >> %LOG_FILENAME2% rem 現在の日付/時間を取得 :TIME set yyyy=%date:~-10,2% set yy=%date:~-8,2% set mm=%date:~-5,2% set dd=%date:~-2,2% set HH=%TIME:~0,2% set MM2=%TIME:~3,2% set SS=%TIME:~6,2% exit /b コード-------------------------------------------------------------------------------- 上記プログラムは日付を2つのログに出力していますが、 echo %BAT_FILE1% 処理日 = %yyyy%%yy%/%mm%/%dd% 処理開始時間= %HH%:%MM2%:%SS%>> %LOG_FILENAME1% echo. >> %LOG_FILENAME1% echo %BAT_FILE1% 処理日 = %yyyy%%yy%/%mm%/%dd% 処理開始時間= %HH%:%MM2%:%SS%>> %LOG_FILENAME2% echo. >> %LOG_FILENAME2% と二重になっている無駄なコードとなり、見栄えが良くないです。 これを1つのコードで2つのログファイルに出力可能な短縮プログラムは可能でしょうか? ご存知の方がいましたら、ご教授願いますでしょうか? 何卒宜しくお願い致します。

  • バッチファイル IF 複数条件方法

    WindowsXP環境にて下記のバッチファイルがあります。 rem --- 時間変数 --- set yyyy=%date:~-10,4% set yy=%date:~-8,2% set mm=%date:~-5,2% set dd=%date:~-2,2% rem --- ログフォルダ変数 --- set LOG_DIR1=D:\LOG rem --- ログファイル変数 --- set LOG_FILE1=LOG.txt set A=1 set B=2 IF %A% == 1 IF %B% == 2 ( echo %yyyy%%mm%/%dd% %HHMMSS%正常終了 >> %LOG_DIR1%\%LOG_FILE1% ) ELSE (echo %yyyy%%mm%/%dd% %HHMMSS%異常終了 >> %LOG_DIR1%\%LOG_FILE1%) pause 上記プログラムだとログ上で【200912/10 正常終了】と表示されるのに、【set A=10】と変更して 【200912/10 異常終了】の表示がログ上に出力されるだろうと期待して実行した結果、 何も表示されてませんでした。 どこに問題があるのでしょうか?

  • バッチファイルの質問です。

    バッチファイルの質問です。 作成しているのですが、最後のif "%BASE_PATH%" == "" ( がどうしても通りません。 表記がおかしいんでしょうか? また別のいい方法があれば教えてください。 rem ************************************************** rem 処理名 :送受信ファイル削除 rem 処理概要 :送受信フォルダのファイルを削除する rem ファイル名 :FILE_DELETE.bat rem 引数 :(1)ファイルID[12文字] (2)データ区分[S:送信、R:受信] rem 戻り値 :正常:0、異常:2 rem ************************************************** rem **** 初期処理 **** set SCRIPT_NAME=FILE_DELETE set TMP_HR=%time: =0% set "DATE_STR=%date:~0,4%%date:~5,2%%date:~8,2%%TMP_HR:~0,2%%time:~3,2%%time:~6,2%%time:~9.2%" set RETCODE=0 set ROOT_P= set ROOT_P=D:\HOME\If set LOG_PATH=D:\HOME\Log set LOG_NAME=%SCRIPT_NAME%_%1.log set BASE_PATH="" rem **** 処理ベースのPATH設定 **** set ARGV1=%1 set AITE_DIR=!ARGV1:~0,2! if "%AITE_DIR%" == "ST" ( set BASE_PATH=%ROOT_P%\ST010 ) if "!ARGV1:~0,5!" == "LE70S" ( set BASE_PATH=%ROOT_P%\LE020 ) rem **** ベースPATHの設定失敗 **** if "%BASE_PATH%" == "" ( echo %DATE% %TIME% %COMPUTERNAME%:ERR-00204 ベースPATHがありません >> "%LOG_PATH%\%LOG_NAME%"

  • 全てのフォルダから最新ファイルを残し削除

    WindowsServer2008にて、 バックアップフォルダを定期的にリフレッシュ (最新以外を削除)するバッチを作りたいです。 CやVBなど、While文、関数のある言語でのプログラム経験がありますが バッチの方は不案内です。何卒ご教授くださいませ。 [処理内容] C:\testdir の配下に、サブフォルダdir1,dir2,dir3が存在します。 C:\testdir にバッチファイル、「dalete.bat」を配置。 実行するのはこの「dalete.bat」になります。 サブフォルダ dir1,dir2,dir3 の中のファイルは、 「no0.zip」,「no1.zip」,「no2.zip」と、規則的な名前です。 残したいのは「no0.zip」,「no1.zip」,「no2.zip」のうち、最新のファイル1個のみです。 [コード1] 次のようなプログラムを書きました。 まずは[dir1]フォルダのみの、 最新ファイル以外を削除するプログラムです。 ------------------------------------------ set L_FILE=C:\testdir\Delete.log echo %DATE% %TIME:~0,8% 処理開始 >> %L_FILE% REM 1フォルダ処理 cd dir1 REM 最新ファイルをリネーム保護 for /f "delims=" %%a in ('dir /b /o:d /a:-d') do set fname=%%a echo "%fname%" をリネーム保存 >> %L_FILE% copy "%fname%" "LASTFILE.zip" REM 他のファイルを削除 del "no*.zip" >> %L_FILE% REM リネーム保護を戻す ren "LASTFILE.zip" "%fname%" echo %DATE% %TIME:~0,8% 処理完了 >> %L_FILE% ------------------------------------------ 結果ログ 2013/11/29 2:17:15 処理開始 "no0.zip" をリネーム保存 2013/11/29 2:17:15 処理完了 ------------------------------------------ フォルダ[dir1]の中身は"no0.zip"のみで、期待した動きです。 [コード2] 次に、[dir1],[dir2],[dir3]全てのフォルダに対し、 最新以外のファイルを削除するコードを、以下のように書きました。 ------------------------------------------ set L_FILE=C:\testdir\Delete_all2.log echo %DATE% %TIME:~0,8% 処理開始 >> %L_FILE% REM フォルダ全てを処理 for /D %%i in (C:\testdir\*) do ( echo %%i フォルダ処理開始 >> %L_FILE% cd %%i REM 最新ファイルをリネーム保護(★) for /f "delims=" %%a in ('dir /b /o:d /a:-d') do set fname=%%a echo "%fname%" をリネーム保存 >> %L_FILE% copy "%fname%" "LASTFILE.zip" REM 他のファイルを削除 del "no*.zip" >> %L_FILE% REM リネーム保護を戻す ren "LASTFILE.zip" "%fname%" ) echo %DATE% %TIME:~0,8% 処理完了 >> %L_FILE% ------------------------------------------ 結果ログ 2013/11/29 2:22:03 処理開始 C:\testdir\dir1 フォルダ処理開始 "" をリネーム保存 C:\testdir\dir2 フォルダ処理開始 "" をリネーム保存 C:\testdir\dir3 フォルダ処理開始 "" をリネーム保存 2013/11/29 2:22:03 処理完了 ------------------------------------------ コード1で、動作確認が取れたコードですが、 ★部で、最新ファイルの取得に失敗しています。 結果、削除処理のみ期待通りに処理されサブフォルダ内の 全ファイルが削除されています。 どうすれば、全フォルダ、最新のみを残しループさせる事が出来るのでしょうか。 どうかお助けください。

  • xcopyのバッチを組みたいです。

    xcopyのバッチを組みたいです。 例えば、c:\data というフォルダを、 d:\test というフォルダ内にxcopyコマンドを使って コピーするとします。 コピー終了した時間を何らかの形で知りたいです。 (実際のデータをコピーするのに、相当時間が かかりそうなので、ずっと見ているわけに いかないのです) 上記のことをやろうと思ったら、バッチを組めば いいと聞いたのですが、そもそもバッチを組むと いうのはどうすればいいんでしょうか。 テキストデータで構文を書いて、拡張子をbatに しておけばいいものなんでしょうか。 また、その構文はどう書けばいいのでしょうか。 以上、どなたか教えてください。 よろしくお願いします。

  • バッチファイルの環境変数の取り扱い

    robocopyでバックアップログを取るようなバッチファイルをインターネットで調べながら 作成してみました。 今日の日付がついて保存されるのですが、下記のhome用1個だけの時はうまくいったのですが 続けて他のフォルダももう1つ追加しようとしたところ、(4行目から6行目) 1.@rem ログの分別の為の変数設定home用 2.set logfile0m="D:\log\home_log_m\%date:~0,4%-%date:~5,2%-%date:~8,2%_backup.log" 3.robocopy "D:\home" "\\nas001\home" /mir /xa:sh /R:1 /W:2 /FFT /LOG+:"%logfile0m%" 4.@rem ログの分別の為の変数設定folder1用 5.set logfile1m="D:\log\folder1_log_m\%date:~0,4%-%date:~5,2%-%date:~8,2%_backup.log" 6.robocopy "D:\san1" "\\nas001\folder1" /mir /xa:sh /R:1 /W:2 /FFT /LOG+:"%logfile1m%" エラー: 無効なパラメーター #6 : "/LOG+:" と表示されて2個目のrobocopyがうまくいきません。 なぜうまくいかないのか考えてみたのは以下の通りです。 set というのを2つ使っているからうまくいかないのでしょうか? もしも上記のことが原因の場合、1個目のset(logfile1m)というのを無効化するといいのでしょうか? その場合無効(初期化?)の方法はありますか? ネットワークの接続などはうまくできています。 よろしくお願いします

  • バッチファイルのタスクスケジューラでの実行について教えて下さい。

    AAAのパソコンのDドライブの111というフォルダを、ネットワーク経由でBBBのパソコンのDドライブの222という共有フォルダ内に333というフォルダ内へxcopyでコピーするバッチ(backup.bat)を作ってタスクスケジューラで1日1回自動実行させようと思うのですが、うまくいきません。どうすればよいのでしょうか? AAAパソコン:Windows2000 professional SP4        000フォルダ内にbackup.bat(共有フォルダではないです)        111フォルダは共有フォルダではないです        ユーザーアカウント⇒Administrator        パスワードはないです        BBBパソコン:WindowsXP professional SP2        222フォルダは共有フォルダ        333フォルダは222の共有フォルダの中        ユーザーアカウント⇒バックアップ        パスワード⇒123 バッチファイル(backup.bat)  ↓  net use \\BBB\222 123 /user:バックアップ  xcopy d:\111 \\BBB\222\333\ /E/C/F/H/R/K> d:\バックアップログ.log  net use \\BBB\222 /delete 上記バッチファイルをAAAパソコンの「タスクの実行するファイル名」に直接登録(d:\000\backup.bat)して実行させてみたのですが、タスクの詳細設定のログ表示でログを見ると、『タスクは次の終了コードで完了しました:(1).』となっていて実行されませんでした。 cmd.exe /c d:\000\backup.batでタスク登録してもだめでした。 バッチファイル(backup.bat)をダブルクリックして実行するとBBBパソコンにコピーできます。 タスク設定時の   実行するアカウント名⇒AAA\Administrator   パスワードはなし よろしくお願いいたします。

  • バッチコマンド【高度なテキストファイル検索方法】

    いつも大変御世話になっております。 使用端末:Windows2000SP4 ツリー構成は以下の(1)~(4)になります。 (1)【E:\test】内にtest.batがあります。 (2)【E:\IFFILE\】内には、テキストファイル(拡張子はtxt)が毎日不定期な数(1ファイルだったり、15ファイルだったり)あります。 (3)【E:\IFFILE\CHK】内には【GOOD】【0_FILE】【No_File】フォルダがあります。 (4)検索対象ファイル:50ファイル 今回悩んでいるの、test.batのコードで、具体的に何をしたいかと言うと・・・ (1)【E:\IFFILE\】内に(4)のファイル名にファイル存在有無の検索をかけます。 検索条件は以下の通りです ・ファイルが存在しない場合(※1) ・ファイルがあるが、サイズが0のファイルが存在する場合(※2) ・ファイルがあり、サイズがあるファイルが存在する場合(※3) (※1)【E:\IFFILE\CHK\No_File】フォルダにそのファイル名ではじまるファイル名にして語尾に日付を付け、 そのファイルの中に【ファイルがありませんでした。】のメッセージを表示。 (※2)【E:\IFFILE\CHK\0_FILE】フォルダにそのファイル名ではじまるファイル名にして語尾に日付を付け、 そのファイルの中に【0件データでした。】のメッセージを表示。 (※3)【E:\IFFILE\CHK\GOOD】フォルダにそのファイル名ではじまるファイル名にして語尾に日付を付け、 そのファイルの中に【データのある正常なデータでした。】のメッセージを表示。 コードは中途半端ですが、下記の通りです。 set yy=%date:~2,4% set mm=%date:~7,2% set dd=%date:~10,2% REM ======================================================= echo %YMD%,%HHMMSS%,"サイズ検索処理開始" REM ======================================================= @echo off for /f %%a in ("E:\IFFILE\L2001.TXT") do set chk=%%~za% if %chk%==0 goto :END echo データのある正常なデータでした。。 >> E:\IFFILE\CHK\GOOD\L2001_%yy%%mm%%dd%.txt goto :EOF :END echo 0件データでした。 >> E:\IFFILE\CHK\0_FILE\L2001_%yy%%mm%%dd%.txt REM ======================================================= echo %YMD%,%HHMMSS%,"サイズ検索処理終了" REM ======================================================= どうもファイルがない場合の処理記述方法と、フォルダ内すべてのファイルの連続検索がわかりません。 どうすればよいのでしょうか?

  • バッチファイル 変数を同名のフォルダ内にコピー

    いつも大変御世話になっております。 WindowsXP SP2に【D:\test\bat】フォルダに【test.bat】があります。 上記バッチファイルは以下のようになっています。 コード------------------------------------------------ For /F "delims=" %%i in (D:\test\siteirename\readme.txt) Do Call :Sub %%i :Sub set DATA=%1 copy D:\test\siteirename\in\test.txt D:\test\siteirename\out\%DATA%\test.txt コード------------------------------------------------ readme.txtには1行目に 200910 という文字列しかなく これを変数に入れ、単純にtest.txtを【D:\test\siteirename\out】内に変数と同じ名前のフォルダを さがしてそのフォルダ内にコピーするはずなのに、【D:\test\siteirename\out】内にもコピーされてしまいます。 これはなぜでしょうか? そもそものバッチに問題があるのでしょうか? 方法をご存知の方がいれば、ご教授願いますでしょうか? ※サンプルがあれば、光栄です。 宜しくお願い致します。