主頁 > 知識(shí)庫 > 用vbs檢索在運(yùn)行對(duì)話框中鍵入的一系列命令的代碼

用vbs檢索在運(yùn)行對(duì)話框中鍵入的一系列命令的代碼

熱門標(biāo)簽:拉薩外呼系統(tǒng)業(yè)務(wù) 百度地圖標(biāo)注是什么意思 廣州ai電銷機(jī)器人一般多少錢 外呼系統(tǒng)telrobot 外呼線路中繼線是什么 合肥高德地圖標(biāo)注 深圳外呼系統(tǒng)收費(fèi) 外呼系統(tǒng)免費(fèi)招代理 怎么看地圖標(biāo)注
問:
您好,腳本專家!有時(shí),我在運(yùn)行對(duì)話框中鍵入了多個(gè)命令,隨后想要對(duì)其進(jìn)行檢索。我知道我最近使用過的命令緩存在某個(gè)地方,因?yàn)楫?dāng)我開始在運(yùn)行對(duì)話框中鍵入時(shí),它們便會(huì)顯示出來。如何使用腳本檢索這些命令?
-- KJ
答:
您好,KJ。您知道,一看到您的問題,我們首先想到的是:為什么我們沒有想過這個(gè)問題?不用說,腳本專家使用運(yùn)行對(duì)話框已經(jīng)有好多年了,并且我們也非常清楚地知道,最近使用的命令(如果您統(tǒng)計(jì)過的話,是最近使用過的 26 個(gè))緩存在計(jì)算機(jī)上的某個(gè)地方。然而,我們從未編寫過可檢索此列表的腳本。我們?cè)趺茨芎雎匀绱嗣黠@的事情呢?
注意:事實(shí)上,令人吃驚的絕不僅限于我們已忽略了如此明顯的事情。例如,到目前為止,腳本專家已在其當(dāng)前所在的大廈中呆了大約一年的時(shí)間了,然而就在幾個(gè)星期前,編寫本專欄的腳本專家才發(fā)現(xiàn)有從其辦公室通往樓下大廳的樓梯。
稍加摸索后,我們發(fā)現(xiàn)該信息存儲(chǔ)在注冊(cè)表中;更確切地說,它作為單個(gè)注冊(cè)表值存儲(chǔ)在注冊(cè)表項(xiàng) HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU 中。這樣不是很好嗎?當(dāng)然很好;畢竟,這使得我們能夠編寫以下腳本:
復(fù)制代碼 代碼如下:

Const HKEY_CURRENT_USER = H80000001 
strComputer = "." 
Set objRegistry = GetObject("winmgmts:\\"  strComputer  "\root\default:StdRegProv") 
strKeyPath = "Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU" 
objRegistry.EnumValues HKEY_CURRENT_USER, strKeyPath, arrValueNames, arrValueTypes 
For Each strValue in arrValueNames 
    If Len(strValue) = 1 Then 
        objRegistry.GetStringValue HKEY_CURRENT_USER,strKeyPath,strValue,strRunCommand 
        intLength = Len(strRunCommand) 
        strRunCommand = Left(strRunCommand, intLength - 2) 
        Wscript.Echo strRunCommand 
    End If    
Next 
該腳本連接到 RunMRU 項(xiàng),然后枚舉在此處找到的所有值的值。(是的,我們知道:值的值?這便是注冊(cè)表術(shù)語的有趣之處。)要實(shí)現(xiàn)該功能,該腳本首先定義一個(gè)名為 HKEY_CURRENT_USER 的常量,并將該值設(shè)置為 H80000001;稍后將使用該常量來告知腳本要處理的注冊(cè)表配置單元。然后,我們連接到本地計(jì)算機(jī)上的 WMI 服務(wù),務(wù)必綁定到 root\default 命名空間,即 WMI 注冊(cè)表提供程序的主目錄。
注意:我們可使用此相同的腳本來檢索遠(yuǎn)程計(jì)算機(jī)中最近使用過的命令嗎?當(dāng)然可以;只需將遠(yuǎn)程計(jì)算機(jī)的名稱分配給變量 strComputer 即可。
連接到 WMI 服務(wù)后,將值 Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU 分配給名為 strKeyPath 的變量。然后使用 EnumValues 方法來獲取 RunMRU 項(xiàng)中所有注冊(cè)表值的集合:
objRegistry.EnumValues HKEY_CURRENT_USER, strKeyPath, arrValueNames, arrValueTypes
正如您所看到的那樣,我們將四個(gè)參數(shù)傳遞給 EnumValues:
參數(shù)
 說明
HKEY_CURRENT_USER
 可在其中找到信息的注冊(cè)表配置單元。
strKeyPath
 HKCU 配置單元中 RunMRU 項(xiàng)的路徑。
arrValueNames
 這是一個(gè)“輸出”參數(shù),用作存儲(chǔ)所有注冊(cè)表值名稱的位置。我們所要做的就是為 EnumValues 提供一個(gè)變量名;然后,EnumValues 將使用 RunMRU 中的所有值名稱來填充此變量。
arrValueTypes
 另一輸出參數(shù),此參數(shù)含有與 RunMRU 中找到的每個(gè)值相對(duì)應(yīng)的數(shù)據(jù)類型。這個(gè)參數(shù)是必需的,但是由于在 RunMRU 中找到的值的數(shù)據(jù)類型均為 REG_SZ,因此,我們實(shí)際上在腳本中并不使用它。
事實(shí)證明,在“運(yùn)行”對(duì)話框中鍵入的每個(gè)命令在注冊(cè)表中都有其對(duì)應(yīng)值;通過使用字母 A 到 Z 為這些值分配了名稱(這也就解釋了為何在注冊(cè)表中只有 26 個(gè)最近使用的命令被跟蹤的原因)。在注冊(cè)表中,RunMRU 如下圖所示:
您好,腳本專家!
執(zhí)行 EnumValues 方法后,我們將返回所有這些值名稱的集合;換言之,我們的集合將由字母 A 到 Z 組成。非常不錯(cuò),只是該集合中不包含任何實(shí)際命令。要獲得這些命令(這是我們的最終目的),我們需要連接到并讀取注冊(cè)表中 26 個(gè)值中的每個(gè)值。
我們能這樣做嗎,我們能很容易地連接到注冊(cè)表中 26 個(gè)值并讀取每一個(gè)值嗎?當(dāng)然可以;事實(shí)上,這就是以下這段代碼所執(zhí)行的操作:
復(fù)制代碼 代碼如下:

For Each strValue in arrValueNames 
    If Len(strValue) = 1 Then 
        objRegistry.GetStringValue HKEY_CURRENT_USER,strKeyPath,strValue,strRunCommand 
        intLength = Len(strRunCommand) 
        strRunCommand = Left(strRunCommand, intLength - 2) 
        Wscript.Echo strRunCommand 
    End If    
Next 
您說對(duì)了:乍一看,它是有點(diǎn)可怕,不是嗎?告訴您原因吧,讓我們向您介紹一個(gè)該 For Each 循環(huán)的簡(jiǎn)化版本,然后我再解釋為何將一些附加代碼添加到此循環(huán)中。該簡(jiǎn)化循環(huán)如下:
For Each strValue in arrValueNames
    objRegistry.GetStringValue HKEY_CURRENT_USER,strKeyPath,strValue,strRunCommand
    Wscript.Echo strRunCommand
Next
在此我們所要做的就是建立一個(gè)循環(huán),該循環(huán)將遍歷所有注冊(cè)表值。要讀取其中的每個(gè)值,我們只需調(diào)用 GetStringValue 方法:
objRegistry.GetStringValue HKEY_CURRENT_USER,strKeyPath,strValue,strRunCommand
GetStringValue 所傳遞的四個(gè)參數(shù):常量 HKEY_CURRENT_USER;變量 strKeyPath;變量 strValue(代表各個(gè)值的名稱,例如 A、B 或 C);名為 strRunCommand 的輸出參數(shù)。通過使用此輸出參數(shù),我們只需指定一個(gè)變量名稱,GetStringValue 方法會(huì)將注冊(cè)表值的值(即,相應(yīng)的“運(yùn)行”命令)分配給它。調(diào)用 GetStringValue 后,我們將回顯 strRunCommand,繼續(xù)循環(huán),并處理集合中的下一個(gè)值。
對(duì)于該簡(jiǎn)化的 For Each 循環(huán)已講了不少了;而真正的 For Each 循環(huán)中的所有額外代碼又怎樣呢?之所以使用額外代碼主要是為了可為我們提供稍好些的輸出。例如,在 RunMRU 項(xiàng)中,有一個(gè)名為 MRUList 的注冊(cè)表值。這并不代表一個(gè)實(shí)際的命令;而是代表最近使用的命令的先后出現(xiàn)順序。這對(duì)我們而言并不重要(至少今天不重要),因此我們寧愿跳過該 MRUList 值。這就是下面的代碼所要執(zhí)行的操作:
If Len(strValue) = 1 Then
在此行代碼中,我們使用 Len 函數(shù)來檢查值名稱中的字符數(shù)。如果字符數(shù)(長(zhǎng)度)等于 1,我們將繼續(xù)進(jìn)行并讀取該值。如果長(zhǎng)度不等于 1(顯而易見,當(dāng) MRUList 具有 7 個(gè)字符時(shí),就屬于這種情況),則我們只需跳過該值并移至集合中的下一項(xiàng)即可。
我們添加的另一小段代碼是:
intLength = Len(strRunCommand)
strRunCommand = Left(strRunCommand, intLength - 2)
如果您查看注冊(cè)表,您會(huì)發(fā)現(xiàn)所有命令的末尾都添加了一個(gè) \1。如果需要的話,可將其保留下來,不過很容易將其去掉。我們所要做的是確定命令的長(zhǎng)度,然后使用 Left 函數(shù)返回字符串中的第一個(gè) x 字符。x 等于什么?它等于字符總數(shù)減 2。這就意味著,我們要獲取除最后 2 個(gè)字符(即 \1)以外的所有字符,并將它們回顯到屏幕上。
至此您已實(shí)現(xiàn)了您的目的:一個(gè)可返回在運(yùn)行對(duì)話框所鍵入的最近使用的命令的腳本。我們?nèi)圆恢郎衩氐臉翘莸降淄ㄏ蚰睦?,但我們需要先做重要的事情?

標(biāo)簽:玉林 臺(tái)灣 嘉興 延安 六安 周口 漳州 廣安

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《用vbs檢索在運(yùn)行對(duì)話框中鍵入的一系列命令的代碼》,本文關(guān)鍵詞  用,vbs,檢索,在,運(yùn)行,對(duì)話框,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《用vbs檢索在運(yùn)行對(duì)話框中鍵入的一系列命令的代碼》相關(guān)的同類信息!
  • 本頁收集關(guān)于用vbs檢索在運(yùn)行對(duì)話框中鍵入的一系列命令的代碼的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章