質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
バックアップ

バックアップとは、保存データやプログラムの複製を異なる記録装置などへ保存することを言います。バックアップを取っておくことで、機器のトラブルでデータが損傷するなどの不測の事態にもデータを複製することが可能です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Q&A

解決済

2回答

4905閲覧

バッチ & vbs 異なる日付フォーマットの取得と比較について

nonki03

総合スコア11

バックアップ

バックアップとは、保存データやプログラムの複製を異なる記録装置などへ保存することを言います。バックアップを取っておくことで、機器のトラブルでデータが損傷するなどの不測の事態にもデータを複製することが可能です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

0グッド

1クリップ

投稿2020/02/13 05:27

編集2020/02/13 10:01

現在、古いバックアップデータが入ったフォルダを削除する「ローテート処理」を作成しようとしています。
削除する際に基準とするのは最終更新時の日付ではなく、
"フォルダ名に書かれている日付" です。

削除するバックアップデータは以下のようなフォルダ名をしています。

TEST_BACKUP_20200209
TEST_BACKUP_20200210
TEST_BACKUP_20200211
TEST_BACKUP_20200212
TEST_BACKUP_20200213
TEST_BACKUP_20200209000001
TEST_BACKUP_20200210000003
TEST_BACKUP_20200211000002
TEST_BACKUP_20200212000002
TEST_BACKUP_20200213000001

時刻の付いているタイプと付いていないタイプがあります。
また、同じ階層にその他ファイルやフォルダも存在します。

参考にしているページは以下のところ
https://oshiete.goo.ne.jp/qa/1106294.html
https://code-base.jp/%E3%83%90%E3%83%83%E3%83%81%E3%81%A7n%E6%97%A5%E4%BB%A5%E5%89%8D%E3%81%AE%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%82%92%E5%89%8A%E9%99%A4/

組んだ処理が以下の内容です。

echo WScript.Echo DateAdd("d",-3,Date) > tmp.vbs for /f "delims=/ tokens=1-3" %%A in ('cscript //nologo tmp.vbs') do set OLD=TEST_BACKUP_%%A%%B%%C del tmp.vbs for /d %%D in (TEST_BACKUP_????????*) do if %%D LSS %OLD% rd /s /q %%D

3日前の日付を取得するvbsを作成、
vbsで取得した日付を[/]ごとに年・月・日へ3分割し、基準ファイル名を生成。
不要になったvbsを削除した後、
カレントのバックアップデータ対象を全てチェック(*を入れて時刻部分ありも対象に)、
基準ファイル名と比べて古ければ削除。

といった流れになっています。

問題視しているのは、このバッチを使うのがドイツの環境であり、
作成されるバックアップデータに使われる日付フォーマットが「yyyyMMdd」固定なのに対し、
基準ファイル名に使われる日付フォーマットが「ddMMyyyy」になることによって、
フォーマット違いで正しい削除ができない可能性があることです。

コントロールパネル>地域 の設定にて、日付フォーマットを「ddMMyyyy」に変更、
地域もドイツに変更し、削除を実行しました。

しかし、VBSで取得されている日付は「ddMMyyyy」の形式になっているのにも関わらず、
3分割した年月日を
set OLD=TEST_BACKUP_%%A%%B%%C
で格納した際には、「TEST_BACKUP_yyyyMMdd」になり、
正常に削除出来ている…というのが現状です。

フォーマットが異なるのに、変数格納した時にフォーマットが変わるのが何故なのかが分かりません。

どなたか、ご教授いただけないでしょうか?

追記

Y.H.さんの回答を参考に、ロケールの取得・変更を行ってログを出力するようにしてみました。

for /f %%E in ('cscript //nologo GetLocale.vbs') do ( echo "%%E" 1>> %LOG% 2>&1  …(1) ) for /f %%F in ('cscript //nologo SetLocale.vbs') do ( echo "%%F" 1>> %LOG% 2>&1  …(2) ) for /f %%G in ('cscript //nologo GetLocale.vbs') do ( echo "%%G" 1>> %LOG% 2>&1  …(3) ) echo WScript.Echo DateAdd("d",-3,Date) > tmp.vbs for /f "delims=/ tokens=1-3" %%A in ('cscript //nologo tmp.vbs') do ( echo "%%A" 1>> %LOG% 2>&1  …(4) echo "%%B" 1>> %LOG% 2>&1  …(5) echo "%%C" 1>> %LOG% 2>&1  …(6) set OLD=CI_DBBACKUP_%%A%%B%%C echo "%%A , %%B , %%C , !OLD!" 1>> %LOG% 2>&1  …(7) ) cscript //nologo tmp.vbs 1>> %LOG% 2>&1  …(8)

GetLocal.vbsでは取得のみ
SetLocale.vbsではロケールのセット(1031)と取得
を行っています。

この結果、次のようにログが出力されました。

(1)"1041"
(2)"1031"
(3)"1041"
(4)"2020"
(5)"02"
(6)"10"
(7)"2020 , 02 , 10 , CI_DBBACKUP_20200210"
(8)2020/02/10

環境自体は以下のようにドイツ環境を模しているのですが、まだ足りないところがあるのでしょうか…
イメージ説明

加えて、別で疑問に思っているところが1点。
バックアップデータを取得してくる処理が同じバッチに入っている関係上、別のJavaアプリからProcessBuilderクラスを使用して引数付きでバッチを蹴っているのですが、これが日本語になるよう設定している…なんてことはあるのでしょうか…

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttyp03

2020/02/13 05:41

VBSのコードがないのでわかりませんが、VBSがyyyyMMddで返してるんじゃないですか?
nonki03

2020/02/13 06:07

echo WScript.Echo DateAdd("d",-3,Date) > tmp.vbs ここの部分で WScript.Echo DateAdd("d",-3,Date) という内容のVBSを作っています。 VBSの削除処理を抜いて、作成されたVBSを単体でたたいてみても ddMMyyyyの形式で取れています。
ttyp03

2020/02/13 06:35

失礼しました。1行目で作成していたのですね。 うーん、確かになぜできているのか不思議ですね。
Y.H.

2020/02/13 10:15

localeID 1041 は日本語ですね。
guest

回答2

0

同じような環境にして実行してみましたが、異なる結果になりました。
OLDは次のようになりました。

OLD=TEST_BACKUP_2102020

もう一度環境を見直してみては。
ちなみに当然ながら3日前に限らずフォルダは削除されました。

投稿2020/02/13 08:42

ttyp03

総合スコア17000

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nonki03

2020/02/13 10:10

やはりそうなるのが普通ですよね。。。 質問に追記している画像のようにドイツの環境を模して変更しているのですが、他に変更する必要のあるところはありそうでしょうか?
guest

0

ベストアンサー

環境依存が無いようにtmp.vbsを以下のようにしてyyyymmdd形式で返してしまった方がいいです。

vbscript

1dt = DateAdd("d",-3, Date) 2WScript.Echo right("0000"&Year(dt),4) & right("00"&Month(dt),2) & right("00"&Day(dt),2)

cmd

1echo dt = DateAdd("d",-3, Date) > tmp.vbs 2echo WScript.Echo right("0000"&Year(dt),4) & right("00"&Month(dt),2) & right("00"&Day(dt),2) >> tmp.vbs 3for /f "usebackq" %J in (`cscript //nologo aaa.vbs`) do set OLD=%J 4del tmp.vbs 5for /d %%D in (TEST_BACKUP_????????*) do if %%D LSS %OLD% rd /s /q %%D

SetLocale 1031とドイツのロケールを指定するといけませんかね?

GetLocale 関数
SetLocale 関数

ロケール ID (LCID) の一覧

投稿2020/02/13 06:53

編集2020/02/14 01:47
Y.H.

総合スコア7918

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nonki03

2020/02/13 08:08

GetLocale()のvbsを試しに作って叩いてみたところ、1031が返ってきました。 地域の設定を変更している為か、既に変わっているようです。 設定しても変わらないと思います。
Y.H.

2020/02/13 09:34 編集

あぁ、ここ(locale)が何か変になっているのかと考えたんですが問題なさそうですね。 vbsの出力が'13/02/2020’となっているのであれば、 あとはもう単なる文字列処理なので、 for /f "delims=/ tokens=1-3" %A in ('echo 13/02/2020') do set OLD=TEST_BACKUP_%A%B%C echo %OLD% と同じ結果になると思うんだけどなぁ。 ちなみにこちらでの結果は「TEST_BACKUP_13022020」 この結果(%OLD%)がTEST_BACKUP_20200213になるんですよね?
nonki03

2020/02/13 10:00

>この結果(%OLD%)がTEST_BACKUP_20200213になるんですよね? そうです。環境の問題かな…と言語パックも取ってきて極力ドイツの環境を模してみているんですが、変わらずyyyyMMddの設定で返ってくる状態です…
Y.H.

2020/02/13 10:18

以下のようにtmp.vbsにsetlocaleを書いてますよね? echo SetLocale(1031) > tmp.vbs echo WScript.Echo DateAdd("d",-3,Date) >> tmp.vbs
nonki03

2020/02/13 10:25

tmp.vbsにはsetlocaleは書いていません。 tmp.vbsの中身は WScript.Echo DateAdd("d",-3,Date) のみです。
Y.H.

2020/02/13 10:26

セットしたプロセスのみで有効なのでtmp.vbsに書かないと意味ないです。
nonki03

2020/02/13 11:07

そ、そうだったんですね… ということは、 SetLocale(1041) WScript.Echo DateAdd("d",-3,Date) >> tmp.vbs と書いたtmp.vbsをバッチから叩き、取得した値が「yyyyMMdd」で取得されるようにすれば、 現地環境がドイツであっても、作成されるバックアップデータに使われる「yyyyMMdd」の日付フォーマットと比較ができる …ということですかね?
Y.H.

2020/02/13 11:16

ん?欲しいのはyyyymmddなのかddmmyyyyなのかどちらでしょう? ddmmyyyyなら1031、yyyymmddなら1041でいけるんじゃないかなと。 echo WScript.Echo DateAdd("d",-3,Date) > tmp.vbs この一行を以下の2行に置き換えてください。 echo SetLocale(1031) > tmp.vbs echo WScript.Echo DateAdd("d",-3,Date) >> tmp.vbs 但し、ドイツ語環境のwindowsでlocaleを日本語(1041)にしただけで日付フォーマットがyyyy/mm/ddになるかは実際にドイツ語版をインストールして確認した方がいいです。
nonki03

2020/02/14 00:55

バックアップフォルダの名前に付く日付が「yyyyMMdd」固定なので、 比較するための基準フォルダ名に付く日付は「yyyyMMdd」にしなければいけないんです。 今日(2020/02/14)から3日前ですと、「TEST_BACKUP_20200211」という基準フォルダ名を作成して バックアップフォルダ名 LSS 「TEST_BACKUP_20200211」 というように比較したいんですね。 ドイツ環境だと恐らく「dd.MM.yyyy」の形式になるので、 現状では基準フォルダ名が「TEST_BACKUP_11.02.2020」になるかと想定しています。 これでは正しく比較ができないのです。 方法としては2つ。 ① SetLocale(1041) を追記したtmp.vbsを作成することで、 ドイツ環境でも「yyyy/MM/dd」で取得できるのであればこのままで。 ② 取得できなさそうであれば、 ドイツ環境では「dd.MM.yyyy」で取得されることを前提に、 delims=. 合わせて set OLD=TEST_BACKUP_%%C%%B%%A とすることで「yyyyMMdd」の形式に置き換える。 というような方法になるのかな…と考えています。
Y.H.

2020/02/14 01:56

ロケールとか気にするのが面倒なのでvbsでyyyymmddで返す方が不具合無くなります。 回答修正しておきました
nonki03

2020/02/15 05:20

バッチからスクリプトを作成する際に「&」のエスケープだけする必要がありましたが、 Y.H.さんの方法でうまくできました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問