「送る」で複数のファイルに一括で更新日付を付加する

下記を保存して「送る」フォルダ内に置く。
Rename.VBS (mirror)

「お忍びリネーム」にてファイル名の末尾に更新日付を付加する機会が多かったが、
Windows7環境に移行して以来正常に動作していないため、VBSにて同様の機能を再現した。

ファイルを選択して右クリック>送る>上記VBSを呼び出す。複数指定可。

リネーム結果がダイアログで表示される。邪魔ならコメントアウトする。

処理結果。ファイル名の末尾に更新年月日がYYYYMMDDHHMMSS形式で付加される。
「コピー」の文言は除去される。

Option Explicit
Const Usage="Usage: CScript.exe Rename.VBS files..."
Dim fso         ' FileSystemObject
Dim Path        ' 現状フルパス
Dim NewPath     ' 変換後フルパス
Dim OldFileName ' 現状ファイル名
Dim NewFileName ' 変更後ファイル名
Dim YMDHMS      ' 更新日付
Dim ext         ' 拡張子
Dim Msg         ' 処理完了時メッセージ
Dim Result      ' 処理結果
Dim k           ' 汎用
Dim Ans         ' 汎用

' 引数制限数変更
If WScript.Arguments.Count()<=0 Then
  WScript.Echo Usage
  WScript.Quit
End If

Set fso=CreateObject("Scripting.FileSystemObject")
For k=0 To WScript.Arguments.Count()-1
  Path=WScript.Arguments.Item(k)
  If fso.FileExists(Path) Then
    ext = fso.GetExtensionName(Path) ' 拡張子の取得
    YMDHMS = getNowYMDHMS(fso.GetFile(Path).DateLastModified) ' 更新日付取得
    OldFileName = fso.GetFileName(Path) ' 変更前ファイル名 ログ出力用
    NewFileName = fso.GetBaseName(Path) ' 拡張子除去したファイル名取得
    NewFileName = repReg(NewFileName," - コピー.*$|^コピー (|\([0-9]+\) )〜 ","") ' コピー〜の除去
    NewFileName = repReg(NewFileName,"_19\d{12}(\b)","$1") ' 年月日除去
    NewFileName = repReg(NewFileName,"_20\d{12}(\b)","$1") ' 年月日除去
    NewFileName = NewFileName & "_" & YMDHMS & "." & ext ' ファイル名組立て
    NewPath = fso.GetParentFolderName(Path) & "\" & NewFileName ' パス組立て
    
    If Path <> NewPath Then ' パスに変化がある場合のみリネーム実施
      Result="×"
      If fso.FileExists(NewPath) Then
        Ans=MsgBox("ファイル名と更新日付が同一のファイルが既に存在します。"&vbLf&vbLf&_
                   "現状 :"&OldFileName&vbLf& _
                   "変換後:"&NewFileName&vbLf&vbLf& _
                   "当ファイルを削除しますか?",_
                   vbYesNoCancel+vbQuestion,"ファイル削除の確認")
        If Ans = vbYes Then
          fso.DeleteFile(Path)
          Result="−"
        End If
      Else
        fso.MoveFile Path,NewPath ' リネーム
        Result="○"
      End If
      Msg = Msg & "   " & OldFileName & vbLf & Result & "> " & NewFileName & vbLf
    End If
  End If
Next
If Len(Msg)>0 Then
  WScript.Echo("【結果】  ×:無視 −:削除 ○:リネーム" & vbCrLf & Msg)
End If
WScript.Quit

' 正規表現でマッチした先頭の文言を抽出
' http://d.hatena.ne.jp/cloned/20090205/
Function getReg(ByVal argTarget, ByVal argPtn)
  Dim re,matches
  Set re = New RegExp
  re.Pattern = argPtn
  set matches = re.Execute(argTarget)
  If matches.Count = 0 Then
    getReg = argTarget
  Else
    getReg = matches.Item(0)
  End If
End Function

' 正規表現でマッチした文言を置換
Function repReg(ByVal argTarget, ByVal argPtn, ByVal argRep)
  Dim re,matches
  Set re = New RegExp
  re.Pattern = argPtn
  repReg = re.Replace(argTarget,argRep)
End Function

' 日付をYYYYMMDDHHMMSS形式に変換
' http://blog.livedoor.jp/akf0/archives/51369351.html
Function getNowYMDHMS(ArgDate)
  getNowYMDHMS = Year(ArgDate)
  getNowYMDHMS= getNowYMDHMS & Right("0" & Month(ArgDate)  , 2)
  getNowYMDHMS= getNowYMDHMS & Right("0" & Day(ArgDate)    , 2)
  getNowYMDHMS= getNowYMDHMS & Right("0" & Hour(ArgDate)   , 2)
  getNowYMDHMS= getNowYMDHMS & Right("0" & Minute(ArgDate) , 2)
  getNowYMDHMS= getNowYMDHMS & Right("0" & Second(ArgDate) , 2)
End Function