ray88’s diary

お仕事で困ったとき用の自分用の覚書

Uipath VBSを実行する(指定した日数よりも前の日付フォルダを削除)

UiPath 目次 - ray88’s diary

※備考:今回はVBScriptでバッチを実行したが、文字コードの問題上、出力引数に結果を日本語格納しようとすると文字化けし、これについての解決方法が最後まで不明だった。なお、入力引数に日本語が含まれており、スクリプト内で処理することについては問題なく動作する。出力引数に格納する時点で文字化けが起こるようだ。UTF-8形式のファイルにしたり、ユニコード対応にチェックをいれるなどしても駄目だった。

指定した親フォルダパスのフォルダ内にあるサブフォルダ名(yyyyMMddHHmmssの日付形式のフォルダ名)
 を取得し、指定した日数よりも前の日付の名前のついたサブフォルダを削除する


■バッチファイル(VBScirpt・ANSI形式・拡張子.vbs)

' 文字列を日付形式に変換する関数
Function ConvertToDate(strDate)
    On Error Resume Next ' エラーハンドリングの開始
    Dim year, month, day, hour, minute, second
    year = Mid(strDate, 1, 4)
    month = Mid(strDate, 5, 2)
    day = Mid(strDate, 7, 2)
    hour = Mid(strDate, 9, 2)
    minute = Mid(strDate, 11, 2)
    second = Mid(strDate, 13, 2)

    ConvertToDate = DateSerial(year, month, day) & " " & TimeSerial(hour, minute, second)

    If Err.Number <> 0 Then
        ConvertToDate = "Invalid Date"
        Err.Clear
    End If
    On Error GoTo 0 ' エラーハンドリングの終了
End Function

' 日付が指定された日数より前かどうかを判定する関数
Function IsOlderThan(dateString, days)
    Dim folderDate
    folderDate = ConvertToDate(dateString)
    
    If folderDate = "Invalid Date" Then
        IsOlderThan = "Invalid Date"
    Else
        IsOlderThan = DateDiff("d", folderDate, Now) > days
    End If
End Function

' サブフォルダを削除するサブルーチン
Sub DeleteSubFolder(folderPath)
    Dim FileSystemObject
    Set FileSystemObject = CreateObject("Scripting.FileSystemObject")
    
    If FileSystemObject.FolderExists(folderPath) Then
        FileSystemObject.DeleteFolder folderPath
    End If

    Set FileSystemObject = Nothing
End Sub

' UiPathからの引数を受け取る
Dim ParentFolderPath, DaysString
ParentFolderPath = WScript.Arguments(0)
DaysString = WScript.Arguments(1)

' 文字列型の日数を数値型に変換
Dim Days
Days = CInt(DaysString)

Dim FileSystemObject, ParentFolder, SubFolder, olderThanResult
Dim foldersToDelete
Set foldersToDelete = CreateObject("Scripting.Dictionary")

Set FileSystemObject = CreateObject("Scripting.FileSystemObject")

If FileSystemObject.FolderExists(ParentFolderPath) Then
    Set ParentFolder = FileSystemObject.GetFolder(ParentFolderPath)
    For Each SubFolder in ParentFolder.SubFolders
        olderThanResult = IsOlderThan(SubFolder.Name, Days)
        If olderThanResult = True Then
            foldersToDelete.Add SubFolder.Path, SubFolder.Path
        End If
    Next
    
    ' 削除対象のサブフォルダを削除
    Dim folderPathToDelete
    For Each folderPathToDelete in foldersToDelete.Keys()
        FileSystemObject.DeleteFolder folderPathToDelete
    Next
    
    WScript.Echo "OK" ' 正常終了
Else
    WScript.Echo "NG" ' 指定された親フォルダが存在しない場合
End If

Set FileSystemObject = Nothing

■Uipath側の設定
Invoke VBScript アクティビティは入力引数も出力引数も文字型