2009/03/09

VBScriptで鯖管理 そにょ1・・・


Update 20090311 0300
   ココのScriptも、以後のログにアーカイブ用意しました。    

Windowsのタスクに登録して、日毎フォルダを作成するだけのスクリプト。
当然設定は 1日1度 00:00 に 動作させる。

なんでそんなモノ要るのかって?
毎日定点で写真を撮ってるので、保存毎にフォルダ作るのが面倒になったからwww
ちなみに、ココで公開したスクリプトは、元々コレ向けだったものが多いですww

今回の分は、以前の仕事で、

"起動後、特定条件の日だけにデータ取得を動作させるよう、処理を自動化してくれ"

と依頼されて創ったモノをバラし、その断片に、新たな構想を加えて作成したモノです。
(確か、六曜で云う、大安 の日だけって指定だったと思う 当然Windowsのタスクにそんな器用な設定はない。)

iniファイル配置で、複数フォルダを対象に出来るのが、ちょっとだけ凝った点w
つか、コレに関しては、用途的に必須だったってのが事実^_^;

と云うのも、タスクにvbsやvbeを登録する場合、
ソレ自体はスクリプトであって、実行する本体ではないので、パラメータの指定が出来ないと云う罠が・・・
もっとも、ランタイム自体から記述してしまえばイイのだろうが、面倒だ。
どうせなら単純登録だけで使いたい・・・ と云う なんとも手抜きな欲がココまでさせたとも云える・・・
それに、複数のフォルダに同処理を施したかったってものあったので、iniファイルを読み込むカタチにしたと(´ヘ`;)

デキルコトはってぇと、指定フォルダ配下に、
   [指定したフォルダ]
└ yyyy
└ mm
└ dd
と云うカタチでフォルダを追加するだけw
指定したターゲットフォルダは、既存していることが必須で、ない場合、処理は実行されません。
自動でターゲットフォルダを作成する処理も検討しましたが、セキュリティ的に疑問を感じた為ヤメました。

書式)
    DateFolderCreate.vbe {対象フォルダ名{,対象フォルダ名}    


パラメータ無指定の場合
   [スクリプトを起動したフォルダ]
└ 2009
└ 03
└ 09
と、なり、

コマンドラインやショートカットからの、パラメータ指定起動の場合、
   [指定したフォルダ]
└ 2009
└ 03
└ 09
と なります。

また、スクリプトが配されているフォルダに、スクリプトと同名のiniファイルがあり、
   C:\Target,C:\Target\Target   
ないし、
   C:\Target
C:\Target\Target
と記述があれば、

   C:\Target
├ 2009
│ └ 03
│ └ 09
└ Target
└ 2009
└ 03
└ 09
と、云う結果になります。

指定先に、対象が既存の場合は、スキップするようになっているので、殆ど意識無く使えます。


毎度のコトながら、役割ごとに関数化してあるので、流用もしやすいかと・・・

▼ウチの鯖たん上で、実働してるスクリプトそのもの・・・^_^;
    '***** ↓↓↓ScriptTitle↓↓↓ *********************************************************     
'PhotoFolderCreate
'- Created by LazwardFox -
'単独起動で、起動フォルダに日付でフォルダを作成。
'パラメータ指定で複数フォルダ上に同一処理を実行。

'注) 20090223 0300 タスクマネージャ動作時、直接指定の場合、パラメータ指定不可

' Update 20090223 1442 必要関数のみに削減
' Update 20090223 1438 関数拡張
' Update 20090223 0253 iniファイルによるフォルダ指定を可能に、スクリプトファイル名を変更して利用。
' Update 20090223 0253 iDT修正
' Update 20090223 0135 iDT修正
' Update 20090222 2141
' Release 20090222 2108
' DevStart 20090222 2014

'***** ↓↓↓ ObjectDecralations ↓↓↓ *************************************************
Set Parameters = WScript.Arguments 'パラメーター取得
Set Fs = WScript.CreateObject("Scripting.FileSystemObject") 'ファイル制御

'***** ↓↓↓ Decralations ↓↓↓ *************************************************
Dim arTargets, iRoot, tFolder, sCD, arCD, iChk, sCN

'***** ↓↓↓MainRoutine↓↓↓ *********************************************************
If Parameters.Count > 0 Then
arTargets = Split(Parameters(0),",")
Else
arTargets = TargetFolders()
End IF
arCD = Split(iDT("\"," ",":",1)(0),"\")
For Each iRoot In arTargets
If Fs.FolderExists(iRoot) Then
tFolder = iRoot
For Each iChk In arCD
sCN = Fs.BuildPath(tFolder,iChk)
If Fs.FolderExists(sCN) Then
Else
Fs.CreateFolder sCN
End If
tFolder = sCN
Next
Else
End If
Next
Set Fs = Nothing
Set WSHShell = Nothing
Wscript.Quit

'***** ↓↓↓Functions↓↓↓ *********************************************************
'------------------------------------
'iDT - 日時文字列 ないし 日/時配列取得 for VBScript
'- Created by LazwardFox -

'Update 20090228 0458 変数宣言変更
'Update 20090223 0959 時刻桁処理変更
'Update 20090223 0253 Len記述忘れ修正
'Update 20090223 0135 変数宣言忘れ修正
'Update 20090210 0218
'Update 20090210 0115
'Release 20090209 2035

' iDT (
' dSplitter - DateSplitString (Normal - "/")
' ,dtSeparater - Date/Time SepaleteString (Normal - " ")
' ,tSplitter - TimeSplitString (Normal - ":")
' ,Control - 配列化 0 or 1 (Default - 1)
' )

Public Function iDT(dSplitter,dtSeparater,tSplitter,Control)
Dim nX, nD, nS, strHMS, sResult 'Update 20090228 0458
nX = Now()
nD = FormatDateTime(Date(),0)
nS = ":" & Split(CStr(FormatDateTime(nX,3)),":")(2) 'Update 20090223 0951
strHMS = FormatDateTime(nX,4) & nS 'Update 20090223 0951
If tSplitter = ":" Then
Else
strHMS = Replace(strHMS,":",tSplitter)
End If
sResult = Cstr(Replace(nD,"/",dSplitter)) & "*" & strHMS
If Control = 1 Then
iDT = Split(sResult,"*")
Else
iDT = Replace(sResult,"*",dtSeparater)
End If
End Function

'------------------------------------
'TargetFolders
'- Created by LazwardFox -
'スクリプトと同名のiniファイルがあれば、内容を配列で取得
'対象フォルダを取得、iniファイルがあれば優先する。戻り値は配列

' Update 20090223 0550 変則的フォルダ名回避のため修正
' Release 20090223 0509

Public Function TargetFolders()
Dim sNFull, rFolder, sN, iniFile
sNFull = Wscript.ScriptFullName
rFolder = Fs.GetParentFolderName(sNFull)
sN = Fs.GetBaseName(sNFull)
iniFile = Fs.BuildPath(rFolder,sN & ".ini")
If Fs.FileExists(iniFile) Then
TargetFolders = iniLoader(iniFile,0)
Else
TargetFolders = Array(rFolder)
End If
End Function

'------------------------------------
'iniLoader - 対象をiniファイルより取得。
'- Created by LazwardFox -

' Update 20090223 0550 戻り値可変 [ 0 - 配列 ] [ 1 - カンマ区切り文字列 ]
' Release 20090223 0509

Public Function iniLoader(iniFile, Control)
Dim nS
nS = Fs.GetFile(iniFile).size
If nS = 0 Then
iniLoader = Array(Fs.GetParentFolderName(iniFile))
Else
Dim iFile, lResult, strResults
Set iFile = Fs.OpenTextFile(iniFile,1) 'iniファイルを読み取りモードで開く
WScript.Sleep 150
Do Until iFile.AtEndOfStream '読み込み
lResult = lResult & ";" & iFile.ReadLine & ";"
Loop
WScript.Sleep 150
iFile.Close 'Iniファイルを閉じる
strResults = Replace(Replace(lResult,";;",","),";","")
If Control = 0 Then
iniLoader = Split(strResults, ",")
Else
iniLoader = strResults
End If
End If
End Function


って、以前のログから読んでるヒトには、使用関数周り、ドコかで見覚え感ありありでしょうが、
まぁ、御愛嬌と云うコトでww

・・・つか、こんなのに用がある閲覧者が居るのかってコトのほうが、いささか疑問だが(´ヘ`;)
<そのまま使えるVBScript 日付 フォルダ 作成 自動化 複数 ルートフォルダ 指定可能>

0 件のコメント:

コメントを投稿