• 締切済み

月末日のフォルダを自動作成したい

batファイルで以下のような処理をしたいのですが上手くいきません。 どなたかご存知でしたらご教授いただきたく・・・ --------------------------------------------------------------------- (1)フラグファイル名によってフォルダを自動生成する  例)   (1)*_25.txtというファイルがあったら、当月25日のフォルダを作成する    →c:\temp\20110425 (2) *_31.txtと言うファイルがあったら、前月末日のフォルダを作成する    →c:\temp\20110331 (2)上記(1)で作成したフォルダの下にファイルの接頭子によってサブディレクトリを作成する  例)   01_*.txtというファイルがあったら   →c:\temp\20110331\01 と作成したい ※上記をsetコマンドを用いて作成してみたのですが、  (1)-(2)の場合にどうしても上手く動きません。  以下、作成してみた駄文:  set zyy=%date:~0,4%  set zmm=%date:~5,2%  rem set zmm=01  set zdd=%date:~8,2%  rem Dフォルダにあるフラグファイルでフォルダを作成  if exist d:\temp\test01\*_05.txt set zfld=%zyy%%zmm%05  if exist d:\temp\test01\*_10.txt set zfld=%zyy%%zmm%10  if exist d:\temp\test01\*_15.txt set zfld=%zyy%%zmm%15  if exist d:\temp\test01\*_20.txt set zfld=%zyy%%zmm%20  if exist d:\temp\test01\*_25.txt set zfld=%zyy%%zmm%25  if exist d:\temp\test01\*_31.txt set/a zmm2=%zmm%-1  if exist d:\temp\test01\*_31.txt ( if %zmm2% equ 0 set zyy2=%zyy% )  if exist d:\temp\test01\*_31.txt ( if %zmm2% equ 0 set/a zyy2=%zyy2%-1 )  if exist d:\temp\test01\*_31.txt ( if %zmm2% equ 0 set zfld=%zyy2%1231 )  if exist d:\temp\test01\*_31.txt ( if %zmm2% equ 1 set zfld=%zyy%0131 )  上記のような感じで、12ヶ月分記述(閏年対応はしない)  その後、以下の構文を発行するとエラーとなってしまいます。  remファイル接頭子によって、サブディレクトリ作成  if exist d:\temp\test01\01*.txt md d:\temp\test01\%zfld%\01 ※ここで『サブディレクトリまたはファイル\01は既に存在します』とエラーになります。   (恐らく、set/aを使っているがため?)   大変お手数ですが、誰かお助け下さい。 以上よろしくお願い致します

みんなの回答

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.1

> ( if %zmm2% equ 0 set zfld=%zyy2%1231 ) > ( if %zmm2% equ 1 set zfld=%zyy%0131 ) 変数 zfld に「…1231【空白】」「…0131【空白】」という文字列が代入されるからではないですか。閉じカッコの前の空白を除去して試してみてください。

Deetch
質問者

お礼

回答ありがとうございます。 なんとか(1)-(2)は突破しました。 ただ『20110331』と言うフォルダまでは作成されるのですが、 その下にサブディレクトリが作成できませんでした。 で、あれこれ試した結果、 『20110331』というような日付のディレクトリまでは作成できるので、 まずCDをかまして日付フォルダに移動してから、 サブディレクトリ作成を試みたところ上手く(2)まで動くようになりました。 大変ありがとうございました。

関連するQ&A

  • バッチファイル 現在のフォルダ名をファイル名に置き換える

    こんにちは。超初心者なのですが教えてください。 ある複数フォルダに格納されている.txtファイルを、現在の フォルダ名を取得して、別フォルダにリネームして 格納するバッチファイルを作成したいと考えています。 for文を繰り返し使わなければいけないことはわかっているのですが、それをどう表現していいのか全然わかりません。 例えば、 データ取得元として以下のファイルがあったら C:\temp\20100101\data1.txt C:\temp\20100101\data2.txt C:\temp\20100101\data3.txt C:\temp\20100102\data1.txt C:\temp\20100102\data2.txt C:\temp\20100103\data1.txt C:\temp\20100103\data2.txt これを別フォルダに、現在のフォルダ名をファイル名にくっつけて 以下のように一つのフォルダに纏めて格納したいと思っています。 ファイルの中身はそのままコピーしたいので、どこかでcopyコマンド を使うかもしれないです。 C:\test\data1_20100101.txt C:\test\data2_20100101.txt C:\test\data3_20100101.txt C:\test\data1_20100102.txt C:\test\data2_20100102.txt C:\test\data1_20100103.txt C:\test\data2_20100103.txt 実装方法として以下までは考えましたが、これ以上は無理そうです。 rem set A=C:\temp rem set B=C:\test for %%A in (C:\temp\) do ( if not "%%A"=="" ( pushd "%%A" for /d %%B in (*) do ( if not "%%B"=="" ( pushd "%%B" for /d %%C in (*) do ( if not "%%C"=="" ( pushd "%%C" ) ) ) ) popd? ) ) 申し訳ありませんが、お助け願います。

  • batの検証依頼

    現在、batを作成中です。 ターゲットが巨大HDD(2TB)のディスクをbatで読み込んで処理中ですが 処理時間が10分程度必要なのでHDDで何度もトライ&エラーで処理するのは効率的ではありません。 しかも、処理を何度も行うとHDDに負担がかかる。 そこで、以下のコードで問題ないか コードを検証してもらえないでしょうか? 長い文字列(フルパス)が何度も出てきて読みにくいので変数で処理すべきでしょうが 自分のコード作成能力上間違いが少ない方法を選んでいます。 コメントをたくさん入れたのでどんな事をやりたいかはご理解願えると思いますが 不明な点は追加で説明いたします。 コードに不都合な点あれば、修正していただければ幸いです。 ’-------------------------------------------------------------------- REM ドライブレターの全フォルダー名のみを階層を含めて出力 REM ドライブ直下のファイル名(フルパス)の出力にも対応 REM ---------------------------------------------------- @echo off set /p D="ドライブを入力してください <例> x --> " cd /d %D%: REM サーチ先のドライブに移動して以下の作業を行う(書き出しもサーチ先になる) REM -- ドライブレターの全フォルダー名のみを階層を含めて出力 REM -- ドライブ直下のファイル名は出力しない dir /b /ad /s>temp1.txt REM -- /d ドライブ直下のファイル名のみを出力 (a-d ドライブ直下のファイル名のみ出力) dir /b /d >temp2.txt REM ファイル結合してコピー REM C:\UsersTAC_\Desktop\Mp3_MergeDrive\ ---> BATがあるフォルダを表す copy /Y temp2.txt + temp1.txt C:\UsersTAC_\Desktop\Mp3_MergeDrive\temp.txt REM tempファイル削除 del /Q temp1.txt del /Q temp2.txt REM 出力ファイルをソート sort /o C:\UsersTAC_\Desktop\Mp3_MergeDrive\temp.txt C:\UsersTAC_\Desktop\Mp3_MergeDrive\temp.txt rename C:\UsersTAC_\Desktop\Mp3_MergeDrive\temp.txt C:\UsersTAC_\Desktop\Mp3_MergeDrive\FileName_ListUp.txt REM ------------------------------------------------ REM Vol1, Vol2, Vol3という変数にボリューム名をセット set Vol1=K-N set Vol2=456 set Vol3=789 REM IDという変数を空でセット set ID= REM wmicコマンドでHDDのvolumenumberを取得し、findコマンドでVol1, Vol2, Vol3の値を検索 REM errorlevelの値に応じて、IDという変数にX, Y, Zの値をセット wmic logicaldisk get volumename | find "%Vol1%" if errorlevel 0 if not errorlevel 1 set ID=X wmic logicaldisk get volumename | find "%Vol2%" if errorlevel 0 if not errorlevel 1 set ID=Y wmic logicaldisk get volumename | find "%Vol3%" if errorlevel 0 if not errorlevel 1 set ID=Z REM 調査結果の表示、numの値で、serialnumberの中に一致するものがあったため、ID=X,Y,Zを表示。 REM serialnumberの中に一致するものがなかった場合、IDには何もセットせずに表示。 if defined ID ( echo Match found. ID=%ID% ) else ( echo No match found. ID=%ID% REM ドライブを加味したファイル名に変名 if defined ID rename C:\UsersTAC_\Desktop\Mp3_MergeDrive\FileName_ListUp.txt C:\UsersTAC_\Desktop\Mp3_MergeDrive\%ID% _FileName_ListUp.txt cls & echo "終了しました" & pause exit /b

  • Windows漢字フォルダ名の扱い(その2)

    先回に引き続きお伺いします。 ■フォルダツリー体系が次のようになっているとき、 D:\TEMP ├─フォルダ名の末尾に機能 │ test1.txt ├─フォルダ名の末尾に表 │ test2.txt ├─途中に機能がある │ test3.txt └─途中に表がある test4.txt ■次のスクリプトを処理させるのですが、 #!perl use strict; &subdir($ARGV[0]); sub subdir { my($dir) = $_[0]; opendir(DIR,"$dir") || die "'$dir' $! stopped"; foreach(sort readdir(DIR)){ next if(/^\.+/); # '.' '..' はパス if(-f "$dir\\$_"){ print "'$dir\\$_'\tはファイルです\n"; }elsif(-d "$dir\\$_"){ print "'$dir\\$_'\tはフォルダです\n"; &subdir("$dir\\$_"); }else{ print "'$dir\\$_'\tは何ですか?\n";#出て欲しくない } } closedir(DIR); } ■結果は、次のようになります。 (※フォルダ名の末尾に特殊な漢字コードがある所が判定できない) C:\>test.pl d:\temp 'd:\temp\フォルダ名の末尾に機能' は何ですか? 'd:\temp\フォルダ名の末尾に表' は何ですか? 'd:\temp\途中に機能がある' はフォルダです 'd:\temp\途中に機能がある\test3.txt' はファイルです 'd:\temp\途中に表がある' はフォルダです 'd:\temp\途中に表がある\test4.txt' はファイルです 先回、色々と教わったこと use encoding "Shift_JIS"; や 局所的に $dir を decodeさせるなどしても上手く行きません。良い方法があれば教えてください。

    • ベストアンサー
    • Perl
  • バッチでループさせた場合、処理に失敗するとループを抜けてしまい、困っています。

    仕事でバッチ作成をしていますが、うまく動作しなくて困っています。 もしわかる方がいましたら、教えていただけると助かります。 <実現したいこと> いくつかのサーバに同じディレクトリがあり、そのディレクトリの下のファイルをサブフォルダを含めて削除したい。 ただし、そのフォルダの下には何が入っているかはそれぞれ異なる(何もない場合もあり) たとえば、F:\test1\というフォルダはすべてのサーバに共通してあるが、その下に1と0のフォルダがあったりなかったりし、ある場合はその直下をすべて削除したい(1もしくは0フォルダは削除しない) また、1もしくは0のフォルダが両方なかった場合は、メッセージを出力したい。 <ソース> ※ a.iniの中身 F:\test1 F:\test2 ・・・(削除対象フォルダの一覧) for /f %%i in (a.ini) do ( set f=0 (1)rem 0フォルダがある場合、その直下を削除 if exist %%i\0\nul (set f=1 && call :sub %%i\0) (2)rem 1フォルダがある場合、その直下を削除 if exist %%i\1\nul (set f=1 && call :sub %%i\1) (3)rem 両方のフォルダがない場合 if %f%==0 (call :notf %%i) ) goto end :notf echo 削除対象フォルダ(%1)なし goto :eof :sub rem ファイル削除 del /s /q %1\*.* rem フォルダ削除 for /f %%i in ('dir /ad /b %1') do rd /s /q %1\%%i goto :eof :end (終了処理) <問題> 以上の処理を実行すると、以下の問題が出ます。 1.(3)両方のフォルダがなかった場合も、notfの処理に行かない 2.(1)0フォルダの中にあるファイルの削除に失敗した場合、(2)の1フォルダに対する処理に行かず、ループを抜けてendに進んでしまう。 申し訳ございませんが、回答お願いします。

  • シンボリックリンク作成のバッチファイル

    親フォルダーに、aフォルダーとbフォルダーが入っています。 aフォルダー配下には、xフォルダーがあり、その中には複数のテキストファイルが入っています。 parent\a\x\test.txt parent\b\ 以下の様なバッチファイルを「送る」に登録しました。 @echo off rem 選択ディレクトリ配下のxディレクトリに移動 cd /D %1\x\ rem カレントディレクトリにあるすべてのファイルを、bディレクトリにコピー for %%i in (*.*) do ( copy "%%i" "..\..\b\" ) これにより、aフォルダーを選択してバッチファイルを実行すると、xフォルダー配下のテキストファイルがbフォルダーの中にコピーされることは確認しました。 ここで、コピーではなく、シンボリックリンク(mklink)を作成したいのですが、引数をどのように設定すればよいでしょうか。いろいろ試しましたがうまくいきませんでした。 ご教示よろしくお願いします。

  • XPバッチプログラムについて

    すいませんおしえてください windowsXPでバッチファイルを作成しています。 動作内容は↓の通りです。 (1)バッチファイルが置いてあるカレントディレクトリ配下にある複数のディレクトリから、ファイル名に「test」を含む.txtファイルを カレントディレクトリにコピーする。(これをカレントディレクトリ配下のディレクトリがなくなるまで繰り返す) ※簡単に言うと、1つ下のディレクトリからコピーしてくるということです。 (2)既にカレントディレクトリに同じ名前のファイルが存在する場合は自動的に連番して上書きしないようにコピーする。 今、(1)については下記の通り作成して動作確認しましたが、このままでは複数のディレクトリに同じファイル名が 存在する場合に上書きされてしまいます。 (2)についてなかなか上手くコーディングできないのですが↓のプログラムに追加すればよいものを教えていただけますでしょうか? もしくは、全体的に間違っていれば、その部分もご指摘お願い致します。 @echo off for /d %%d in (*) do ( if exist %%d\*test*.txt copy %%d\*test*.txt *test*.txt ) 以上、よろしくお願い致します。

  • フォルダを自動作成するばっちについて

    初めての投稿になります。 OKWaveで過去の記事を参考に、フォルダを自動作成するバッチを 作ったのですが、 同名ファイルを作ろうとすると、エラーも何も表示されませんが、 スルーされてしまうみたいで、フォルダ自体も作成されず、上書きもされません。 同じファイルに自動で連番を付けるなどの回避策など何かありませんでしょうか。 例、テスト   テスト01   テスト02       etc等 バッチ内容が以下になります。 set /p USER_INPUT=フォルダ名を入れてください。: mkdir "%USER_INPUT%" ご教授よろしくお願いいたします。

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

    いつも大変御世話になっております。 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文をうまく使い、フォルダを変数で順に格納してマッチングするような 作成になると思いますが、難しくて苦戦しています。 方法をご存知の方がいれば、ご教授願いますでしょうか? ※サンプルがあれば、光栄です。 宜しくお願い致します。

  • バッチファイルとVBスクリプトの連携エラーコード取得

    イベントログにアベンドしたJOBが出力されない場合 せめて、logファイルにだけでも内容を書きたいのですが うまくいきません。 リターンコードが全部(1)の元バッチファイルで0がかえってきます。 どなたがご教授願います。 (1)親バッチファイルの中味 @echo off rem============================================== rem rem ARG1 = スケジュール日 rem ARG2 = ネットワーク名 rem ARG3 = 終了コード rem rem ================================================ set SDATE=%1 set NETWORK=%2 set RC=%3 set SDATE_SHORT=%SDATE:~2,6% set WK_DIR=D:\temp set TOML_TXT=%WK_DIR%\toml_%NETWORK%.txt set VBSCRIPT=D:\stage\tools\bat\GetJobName.vbs echo ### ARG1(%1) ARG2(%2) ARG3(%3) ### if "%RC%"=="00" ( echo NETWORK NORMAL END #AUTONEND# ) else ( echo NETWORK ABNORMAL END #AUTONEND# if exist %TOML_TXT% ( del %TOML_TXT% ) toml -p999 > %TOML_TXT% cscript //Nologo %VBSCRIPT% %SDATE_SHORT% %NETWORK% %RC% %TOML_TXT% )      if not "%errlrlevel%"=="0" ( set EVT_CRT_RC=%errorlevel% echo EVETCREATE Failed. RC=%EVT_CRT_RC% ) ) exit (2)VBスクリプトの中味 800文字以上になるので、補足要求してください。 (3)イベントログ出力バッチファイルの中味 @echo off rem rem 引数 rem %1:SDATE rem %2:NETWORK rem %3:RC rem %4:JOB set MSG=A-AUTO JOBNET : NETWORK(%2) JOB(%4) SDATE=%1 ABNORMALLY ENDED RC=%3 eventcreate /l application /t error /so autonend /id 999 /d "%MSG%" exit %errorlevel%

  • ファイル移動処理(コマンドプロンプト 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 )