-PR-
回答 受付中

フォルダの条件付き世代管理(ローテーション)

  • すぐに回答を!
  • 質問No.9353015
  • 閲覧数52
  • ありがとう数2
  • 気になる数0
  • 回答数2

お礼率 100% (2/2)

VBSの質問です。

■やりたいこと
1)設定ファイルを読み込んで、バックアップするフォルダの世代数(2世代分)と、フォルダ名を取得する。
2)対象フォルダ内にある任意2文字のサブフォルダがあることを確認し、作成日付でソート(古い順)する。
3)直近の新しい任意2文字のサブフォルダを2世代分を残して、3世代以降は削除する。

VBS自体が初心者でサイトなどで勉強しておりましたが、結局実装できませんでした。
上記につきまして、どのように実装すれば良いかお分かりの方がいらっしゃいましたら、
ご教授いただけますと幸いです。

よろしくお願いいたします。
通報する
  • 回答数2

回答 (全2件)

  • 回答No.1
レベル14

ベストアンサー率 28% (4378/15495)

質問者はシステム管理者ですか。
こういうのは、(営利)業務の一環の中で起こるニーズだと思う。
素人がシコシコ作るような内容や分野ではないと思う。まして無料の質問コーナーに質問して、コードを書いてもらい、コピペして済まそうというのは、そのむつかしさや、複雑さ、テスト検証の確実性などから無理だと思う。
 フリーソフトがあるか探して、見つからないなら、市販のソフトを探すべきだと思う。そのためには日ごろからの情報収集(雑誌広告や宣伝郵便物)や相談できる人的ネットを作っておかないとダメだと思う。
少し拡張すると、商用目的のソフトにもなりそうな内容のものを、無料で提供せよと言っているように思えるので無理があると思う。
ーー
第何世代という判別は、質問者が思っている内容(用語)では、文章で書けばどういう内容になるのか。
お礼コメント
hitandaway18

お礼率 100% (2/2)

imogasiさん

ご回答ありがとうございます。インラインにて失礼いたします。

> 質問者はシステム管理者ですか。
⇒システム管理者ではなく、ヘルプサポートになります。
質問させていただいた経緯につきまして、現場で社内システムのとあるフォルダを作成日付でソートし、直近の新しい日付フォルダを削除できないか?という相談があったためです。

こういうのは、(営利)業務の一環の中で起こるニーズだと思う。
素人がシコシコ作るような内容や分野ではないと思う。まして無料の質問コーナーに質問して、コードを書いてもらい、コピペして済まそうというのは、そのむつかしさや、複雑さ、テスト検証の確実性などから無理だと思う。
 フリーソフトがあるか探して、見つからないなら、市販のソフトを探すべきだと思う。そのためには日ごろからの情報収集(雑誌広告や宣伝郵便物)や相談できる人的ネットを作っておかないとダメだと思う。
⇒おっしゃる通りです。

質問内容がざっくりで、且つ、不快に思われてしまう質問をしてしまい、申し訳ありませんでした。
投稿日時 - 2017-07-19 01:21:01
  • 回答No.2
レベル12

ベストアンサー率 41% (181/439)

「設定ファイルを読み込んで」などとありますが、「設定ファイル」の構造が全く分からないので、以下は、一部分のサンプルです。

「フォルダを古い順にソート」して、それをどうするのかもよく分かりませんので、今回はここ(サブフォルダを古い順にソート)までです。

Option Explicit
Dim c ,d(), f, gf, n, i, j, so, x
Set so = CreateObject("Scripting.FileSystemObject")
Set gf = so.GetFolder(".")
c = - 1
For Each f In gf.SubFolders
Set n = so.GetFolder(gf & "\" & f.Name)
c = c + 1
ReDim Preserve d(c)
d(c) = n.DateCreated
Next
For i = 0 to c - 1
For j = i + 1 to c
If d(i) > d(j) Then
x = d(i)
d(i) = d(j)
d(j) = x
End If
Next
Next
Set gf = Nothing
Set so = Nothing
MsgBox("Finished!")


できるだけ詳しい説明です。

Option Explicit

「厳密に」とか「明確に」というような意味で、このオプションを設定すると、変数は、その使用の前に「Dim」等によって、宣言しておかなければなりません。

Set so = CreateObject("Scripting.FileSystemObject")

ファイルやフォルダを扱えるようにしています。

Set gf = so.GetFolder(".")

プログラムファイル(「~.vbs」ファイル)が存在するフォルダを取得しています。

c = - 1

カウント用変数の初期化。

For Each f In gf.SubFolders

プログラムファイルの存在するフォルダ内のサブフォルダを1つずつ処理。

Set n = so.GetFolder(gf & "\" & f.Name)

見つかったサブフォルダを取得しています。

c = c + 1

1つカウント。

ReDim Preserve d(c)

「ReDim」は、配列変数の「再宣言」です。

したがって、それまであった配列変数は、消えてなくなり、新たに新規作成されるのと同じになります。

しかし今回は「ReDim Preserve」と「Preserve」が付いていますので、それまでの値が保持されます。

すなわち、配列変数の添え字(「()」内の数字)を1つずつ増やしていくような場合に使います。

d(c) = n.DateCreated

新たに見つかったフォルダの「作成日時」を、配列変数に格納しています。

Next

を、すべてのフォルダについて繰り返します。

For i = 0 to c - 1
For j = i + 1 to c
If d(i) > d(j) Then
x = d(i)
d(i) = d(j)
d(j) = x
End If
Next
Next

「作成日時」を「古い順」に並び替えています。

Set gf = Nothing
Set so = Nothing

「Set」で使った変数は、使用後、「Nothing」で、解放しておきます。

MsgBox("Finished!")

最後に、「Finished!」と表示しています。
お礼コメント
hitandaway18

お礼率 100% (2/2)

Prome_Linさん

ご回答いただき、有難う御座いました。
また、解説につきましては理解を深めさせていただきます。
(今日は勉強時間が無かった為、明日以降にvbsファイルにして実行してみます。)

> 「設定ファイルを読み込んで」などとありますが、「設定ファイル」の構造が全く分からない
⇒大変失礼いたしました。構造は下記となります。
■設定ファイル(仮にC:\tmp\Environment.conf)
intGEN=2  #直近の新しいフォルダを2つ残しておきたいため。
strBAK=C:\Backup #バックアップフォルダパス。

また、バックアップフォルダの中身についても記載漏れしておりました。構造は下記となります。
■C:\Backup の中身(名前が2文字と5文字のフォルダだけが存在してます。)
04 #作成日付が2016/04/01、更新日付は更新されてしまうタイミングで変わってしまいます。
05 #作成日付が2016/05/01、更新日付は更新されてしまうタイミングで変わってしまいます。
06 #作成日付が2016/06/01、更新日付は更新されてしまうタイミングで変わってしまいます。
~~~略~~~
10 #作成日付が2016/10/01、更新日付は更新されてしまうタイミングで変わってしまいます。
11 #作成日付が2016/11/01、更新日付は更新されてしまうタイミングで変わってしまいます。
12 #作成日付が2016/12/01、更新日付は更新されてしまうタイミングで変わってしまいます。
01 #作成日付が2017/01/01、更新日付は更新されてしまうタイミングで変わってしまいます。
02 #作成日付が2017/02/01、更新日付は更新されてしまうタイミングで変わってしまいます。
03 #作成日付が2017/03/01、更新日付は更新されてしまうタイミングで変わってしまいます。
1year #作成日付が2017/01/01、更新日付は更新されてしまうタイミングで変わってしまいます

よろしくお願いいたします。
投稿日時 - 2017-07-19 01:39:48
  • 回答数2
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
-PR-
-PR-

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


専門家があなたの悩みに回答!

-PR-

ピックアップ

-PR-
ページ先頭へ