Marumaru's TinyPlaza

(2011.06.14)(tips)DOSバッチで古いバックアップファイルを削除する方法

覚書

データをバックアップするDOSコマンドのバッチファイルを作って毎週流しています。

データはYYYYMMDDの名前のフォルダに格納されるんですが、しばらく放っておくと日付のフォルダがいっぱい溜まってしまいHDDを圧迫するので、気づいた時に古いのを消していたのですが、面倒なので古いバックアップフォルダを消す処理をバッチの追加しました。

  • カレントディレクトリのYYYYMMDD形式(20??????)のフォルダを新しい方から2個残して消します。
  • 更新日ではなく、フォルダ名順で見ています。
  • 残す数はLEAVE_DIR_NUMBERで設定。


@echo off

setlocal enabledelayedexpansion
set /a LEAVE_DIR_NUMBER=2
set /a cnt=0

for /f %%A in ('dir 20?????? /b /o-n') do (
  if !cnt! GEQ %LEAVE_DIR_NUMBER% (
    echo "削除するフォルダ>>" %%A
    rd %%A /s/q
  )
  set /a cnt+=1
)


これで、バックアップバッチの機能が

  1. 古いバックアップフォルダを削除する
  2. 指定したファイルを日付のフォルダコピーする
  3. コピーしたファイルをログに書き出す
  4. FTPからサイトのデータをダウンロードする

と言う結構高機能なものになって一人で悦に入ってます。 ファイル操作するならWSHを使った方が楽なんですけど、レガシーなDOSバッチファイルでするところに格好良さを感じてしまう懐古厨なのでした。

実際、DOSのバッチってシンプルだから簡単な操作をするには便利なんですよね。慣れないと可読性が悪いところはあるけれど。



(2011.06.14)(tips)WSHによるプロセスの二重起動防止スクリプト

覚書用

スケジューラソフトを二重起動してしまって予定を上書きして困る事が多かった為、二重起動防止のスクリプトをWHSで作ってみました。

WSHってタスクマネージャの起動プロセス一覧なんて拾えるんだ……。

  • 特定のプロセスが未起動なら指定のプログラムを実行するスクリプト(二重起動防止)
    • 貼りつけて、拡張子をvbsで実行。(起動するプログラムと同じフォルダに置くのが望ましい)
    • 起動プログラムのショート代わりにこのスクリプトを使うと便利かもしれない。

Option Explicit
On Error Resume Next

Const ZERO = 0
Const ERR_MSG_ALREADY_STARTED = "このアプリケーションは既に起動されています。"

Dim objProcessList
Dim objProcess
Dim objWshShell
Dim strProcessName
Dim strExecuteCmd
Dim isAlreadyStarted

'起動状態を確認したいプロセス名
strProcessName = "(タスクマネージャに表示されるプロセス名)"
'プロセスが未起動状態の際に実行するファイル(フルパス)
strExecuteCmd = "(起動するファイル名)"

isAlreadyStarted = false

Set objWshShell = WScript.CreateObject("WScript.Shell")
Set objProcessList = GetObject("winmgmts:").InstancesOf("win32_process")

For Each objProcess In objProcessList
  If StrComp(LCase(objProcess.Name),strProcessName,vbTextCompare) = ZERO Then
    If Err.Number = ZERO Then
      isAlreadyStarted = true
      Exit For
    Else
      WScript.Echo Err.Description
    End If
  End If
Next

If isAlreadyStarted Then
  WScript.Echo ERR_MSG_ALREADY_STARTED
Else
  objWshShell.Run strExecuteCmd
End If

Set objProcessList = Nothing
Set objWshShell = Nothing




<(2011.06.11)モンハン再び (2011.06.15)そうだ 京都、行こう。>