一些有趣的VBS指令碼

2023-03-07 18:00:11

一些實用的VBS指令碼

擷取螢幕並將截圖儲存到剪貼簿

With CreateObject("Word.Basic")
 .Sendkeys "{prtsc}"
 .FileQuit '.AppClose
End With

Msgbox "已將螢幕擷取到剪貼簿。", vbSystemModal+vbInformation, WScript.ScriptName

這段指令碼使用 Visual Basic Scripting (VBS) 編寫,目的是擷取螢幕並將截圖儲存到剪貼簿中。

具體解釋如下:

  1. CreateObject("Word.Basic"):建立一個 Word.Basic 物件。Word.Basic 是 Microsoft Word 中的一個宏語言,可以通過該物件在程式碼中模擬鍵盤輸入。

  2. Sendkeys "{prtsc}":在 Word.Basic 物件中傳送 "{prtsc}" 鍵的按鍵事件,該鍵是螢幕截圖的快捷鍵。

  3. FileQuit:在 Word.Basic 物件中關閉 Word 應用程式。

  4. Msgbox:在螢幕上彈出一個訊息方塊,顯示「已將螢幕擷取到剪貼簿。」的文字內容,並以「WScript.ScriptName」為標題。

因此,這段指令碼的作用是擷取當前螢幕的截圖,並將其儲存到剪貼簿中,同時彈出一個訊息方塊提示操作成功。

獲取 Windows 系統的開機、關機時間資訊

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")
Set colLoggedEvents = objWMIService.ExecQuery _
("Select * from Win32_NTLogEvent " _
& "Where Logfile = 'System' And EventCode = '6005' Or EventCode = '6006'")
For Each objEvent In colLoggedEvents
  Flag = Flag + 1
  If Flag = 1 Then
    Wscript.Echo "本次開機時間: " & FormatWMIUTC(objEvent.TimeWritten)
  ElseIf Flag = 2 Then
    Wscript.Echo "上次關機時間: " & FormatWMIUTC(objEvent.TimeWritten)
  ElseIf Flag = 3 Then
    Wscript.Echo "上次開機時間: " & FormatWMIUTC(objEvent.TimeWritten)
    Exit For
  End If
Next

'FormatUTC
Function FormatWMIUTC(WMIDateString)
  DS = " // :: "
  FormatWMIUTC = Left(WMIDateString,2)
  For i = 2 To 7
    FormatWMIUTC = FormatWMIUTC & Mid(WMIDateString, i * 2 - 1, 2) & Mid(DS,i,1)
  Next
  'FormatWMIUTC = Mid(WMIDateString, 1, 4) & "年" _
  '      & Mid(WMIDateString, 5, 2) & "月" _
  '      & Mid(WMIDateString, 7, 2) & "日 " _
  '      & Mid (WMIDateString, 9, 2) & ":" _
  '      & Mid(WMIDateString, 11, 2) & ":" _
  '      & Mid(WMIDateString,13, 2)
End Function

這段指令碼使用 VBScript 語言編寫,目的是獲取 Windows 系統的開機、關機時間資訊。

具體解釋如下:

  1. strComputer = ".":將計算機名稱設定為本地計算機。
  2. Set objWMIService = GetObject("winmgmts:" _:建立一個 WMI 服務物件,用於存取 Windows 管理資訊。
  3. Set colLoggedEvents = objWMIService.ExecQuery _:使用 WMI 查詢語言執行一個 WMI 查詢,並將結果儲存在一個事件物件集合中。
  4. ("Select * from Win32_NTLogEvent " _:查詢 Win32_NTLogEvent 類中的所有紀錄檔事件。
  5. & "Where Logfile = 'System' And EventCode = '6005' Or EventCode = '6006'"):限制查詢結果,只返回系統事件紀錄檔中的開機和關機事件。
  6. For Each objEvent In colLoggedEvents:迴圈遍歷查詢結果集合中的每一個事件物件。
  7. Flag = Flag + 1:用於記錄事件物件的個數。
  8. If Flag = 1 Then:判斷當前事件物件是否為第一個事件物件(即本次開機事件)。
  9. Wscript.Echo "本次開機時間: " & FormatWMIUTC(objEvent.TimeWritten):將本次開機時間輸出到控制檯,並呼叫 FormatWMIUTC 函數將事件時間格式化。
  10. ElseIf Flag = 2 Then:判斷當前事件物件是否為第二個事件物件(即上次關機事件)。
  11. Wscript.Echo "上次關機時間: " & FormatWMIUTC(objEvent.TimeWritten):將上次關機時間輸出到控制檯,並呼叫 FormatWMIUTC 函數將事件時間格式化。
  12. ElseIf Flag = 3 Then:判斷當前事件物件是否為第三個事件物件(即上次開機事件)。
  13. Wscript.Echo "上次開機時間: " & FormatWMIUTC(objEvent.TimeWritten):將上次開機時間輸出到控制檯,並呼叫 FormatWMIUTC 函數將事件時間格式化。
  14. Exit For:退出迴圈。
  15. Function FormatWMIUTC(WMIDateString):定義一個函數,用於將 WMI 時間格式轉換為可讀時間格式。
  16. DS = " // :: ":定義一個分隔符,用於分隔年、月、日、時、分、秒。
  17. FormatWMIUTC = Left(WMIDateString,2):將時間字串中的前兩個字元(即年份)賦值給格式化時間字串。
  18. For i = 2 To 7:迴圈遍歷時間字串中的月、日、時、分、秒資訊。
  19. FormatWMIUTC = FormatWMIUTC & Mid(WMIDateString, i * 2 - 1, 2) & Mid(DS,i,1):將每個時間資訊和分隔符分別拼接到格式化時間字串中。
  20. Next:迴圈結束。
  21. End Function:函數定義結束。

建立以當前日期命名的資料夾

Currentdate1=date()

CreateFolders "d:\Desket\"  & Currentdate1

Function CreateFolders(path)
    Set fso = CreateObject("scripting.filesystemobject")
    CreateFolderEx fso,path
    set fso = Nothing
End Function

Function CreateFolderEx(fso,path)
    If fso.FolderExists(path) Then
        Exit Function
    End If
    If Not fso.FolderExists(fso.GetParentFolderName(path)) Then
        CreateFolderEx fso,fso.GetParentFolderName(path)
    End If
    fso.CreateFolder(path)
End Function

這段指令碼的功能是建立一個以當前日期為名的資料夾(在指定路徑下),如果該資料夾已經存在,則不進行任何操作。

具體地,指令碼首先呼叫 date() 函數獲取當前日期,並將其儲存在 Currentdate1 變數中。然後呼叫 CreateFolders 函數來建立資料夾,傳入的引數是指定路徑和當前日期拼接而成的字串。在 CreateFolders 函數中,首先建立一個 scripting.filesystemobject 物件,然後呼叫 CreateFolderEx 函數,該函數會遞迴地建立目錄(如果它們不存在)。如果目錄已經存在,則直接退出函數,否則遞迴建立目錄。最後,關閉 scripting.filesystemobject 物件。