使用vbscript指令碼在表單中進行選擇的代碼

來源:互聯網
上載者:User

問:
嗨,Scripting Guy!我想建立一個帶有四個選項按鈕的表單,其中每個按鈕各代表一台電腦。可以選擇一個選項按鈕,單擊另一個按鈕,然後指令碼將在所選的電腦上運行。我怎樣才能做到?

-- CW

答:
嗨,CW。如果我們所說的只是 VBScript 和 Windows Script Host,那麼這個問題很簡單:辦不到。除了顯示訊息框以外,VBScript 和 WSH 都無法建立圖形化使用者介面;沒辦法通過指令碼使用選項按鈕、列表框、下拉式清單以及其他圖形元素。

但是——噢,你們以前一定見過這種情況。沒錯:我們先告訴您某事辦不到,然後再告訴您做事的方法。(嗨,每個人多需要點技巧,不是嗎?)沒錯:雖然您不會只用 VBScript 實現這一點,但是完全可以使用 HTA(HTML 應用程式)來實現。

我們今天不會花太多時間來談論 HTA;如果您對此感興趣,可以尋找大約一年前我們針對該主題推出的網路廣播。可以說,HTA 使我們能夠將 Internet Explorer 和指令碼代碼結合在一起,並反過來為指令碼提供圖形化使用者介面。雖然還有一些方法可以將圖形化使用者介面合并到指令碼中,但是對於才開始涉足 GUI 開發的使用者來說,這可能是最簡單的方法。

讓我們先提供 HTA 的代碼,然後再解釋其工作原理。此樣本 HTA 顯示了四個選項按鈕,其中每個按鈕各代表一台電腦。選擇一台電腦,並單擊一個“Run Script(運行指令碼)”按鈕;完成後,將運行一個子常式。該程式將串連到已選定的電腦,然後報告該電腦上所安裝的作業系統的名稱。很不錯吧?如要瞭解其工作原理,複製該代碼,將其粘貼到記事本中,然後以 .hta 副檔名(比如:os_name.hta)儲存檔案。不要使用 .vbs 副檔名;那樣行不通。副檔名必須是 .hta。

複製代碼 代碼如下:<SCRIPT LANGUAGE="VBScript">

Sub RunScript

If ComputerOption(0).Checked Then
strComputer = ComputerOption(0).Value
End If
If ComputerOption(1).Checked Then
strComputer = ComputerOption(1).Value
End If
If ComputerOption(2).Checked Then
strComputer = ComputerOption(2).Value
End If
If ComputerOption(3).Checked Then
strComputer = ComputerOption(3).Value
End If

If strComputer = "" Then
Exit Sub
End If

Set objWMIService = GetObject _
("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery _
("Select * From Win32_OperatingSystem")
For Each objItem in ColItems
Msgbox objItem.Caption
Next

End Sub

Sub CancelScript
Self.Close()
End Sub

</SCRIPT>

<BODY>
<input type="radio" name="ComputerOption" value="atl-ws-01">atl-ws-01<BR>
<input type="radio" name="ComputerOption" value="atl-ws-02">atl-ws-02<BR>
<input type="radio" name="ComputerOption" value="atl-ws-03">atl-ws-03<BR>
<input type="radio" name="ComputerOption" value="atl-ws-04">atl-ws-04<P>

<input id=runbutton class="button" type="button" value="Run Script" name="ok_button"
onClick="RunScript">

<input id=runbutton class="button" type="button" value="Cancel" name="cancel_button"
onClick="CancelScript">

</BODY>

那麼該程式碼封裝含哪些內容呢?我們可以將該代碼分為四部分:其中有兩個部分使用 HTML 標籤來實現選項按鈕以及“Run Script(運行指令碼)”和“Cancel(取消)”按鈕,而另外兩個部分則根據您所點擊的是“Run Script”還是“Cancel”來運行子常式。讓我們更進一步瞭解這幾個部分。

例如,HTML 程式碼在此顯示這四個選項按鈕。(如果您瞭解 HTML,那麼這裡就沒有什麼特別的;這是標準的 HTML 編碼。)請注意,所有按鈕都有相同的名稱 (ComputerOption);這是為了確保一次只能選擇一個按鈕。還要注意,每個按鈕的“值”都被設為相應電腦的名稱:

<BODY>
<input type="radio" name="ComputerOption" value="atl-ws-01">atl-ws-01<BR>
<input type="radio" name="ComputerOption" value="atl-ws-02">atl-ws-02<BR>
<input type="radio" name="ComputerOption" value="atl-ws-03">atl-ws-03<BR>
<input type="radio" name="ComputerOption" value="atl-ws-04">atl-ws-04<P>

這是顯示“Run Script”和“Cancel”按鈕的代碼。這裡的關鍵是“onClick”參數(在單擊按鈕時,指示該運行哪個子常式)。正如單擊第一個按鈕所能看到的,RunScript 子常式將運行;單擊第二個按鈕,CancelScript 子常式將運行:

<input id=runbutton class="button" type="button" value="Run Script" name="ok_button"
onClick="RunScript">

<input id=runbutton class="button" type="button" value="Cancel" name="cancel_button"
onClick="CancelScript">

</BODY>

順便說一下,CancelScript 子常式會關閉 HTA。正如您看到的,整個過程一點都不複雜:

Sub CancelScript
Self.Close()
End Sub

現在——最終!——我們要遇到好事了。選擇一個選項按鈕,然後單擊“Run Script”。我們的 HTA 是如何知道所選擇的按鈕以及如何知道對哪台電腦運行指令碼?那麼,到底要在哪裡運行指令碼呢?放鬆點;一切都在 RunScript 常式中:

複製代碼 代碼如下:Sub RunScript

If ComputerOption(0).Checked Then
strComputer = ComputerOption(0).Value
End If
If ComputerOption(1).Checked Then
strComputer = ComputerOption(1).Value
End If
If ComputerOption(2).Checked Then
strComputer = ComputerOption(2).Value
End If
If ComputerOption(3).Checked Then
strComputer = ComputerOption(3).Value
End If

If strComputer = "" Then
Exit Sub
End If

Set objWMIService = GetObject _
("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery _
("Select * From Win32_OperatingSystem")
For Each objItem in ColItems
Msgbox objItem.Caption
Next

End Sub

該子常式的前半部分用以確定所選的具體按鈕。選項按鈕(至少是具有相同名稱的按鈕)作為數組進行儲存;數組中的第一個按鈕是項目 0,第二個按鈕是項目 1 等等。我們在這裡所做的就是確定選擇了哪個按鈕;這可以通過查看每個按鈕的“Checked(選定)”屬性來實現。例如,這行代碼用以確定按鈕 0(數組中的第一個按鈕)的“Checked”屬性是否為 true;如果是的話,就表示所選定的就是該按鈕:

If ComputerOption(0).Checked Then
如果“Checked”為 true,又如何呢?那麼,隨後將對變數 strComputer 指派該選項按鈕的值(同時記住,該按鈕的值恰好是電腦的名稱):

strComputer = ComputerOption(0).Value
如果“Checked”為 False,那又如何呢?沒什麼大不了;畢竟我們已經檢查了每個選項按鈕的值。遲早都會弄清楚選定了哪個按鈕(而且只能有一個)。如果最終確定未選擇任何按鈕,那麼就將退出該子常式。這就是該代碼所完成的工作:

複製代碼 代碼如下:If strComputer = "" Then
Exit Sub
End If

如果選擇了一個按鈕,那麼 strComputer 將為我們所要串連的電腦的名稱。這就是該子常式的後半部分所完成的工作:串連到指定電腦並返回其上所安裝的作業系統的名稱的是一個標準 WMI 指令碼。

喲!我們敢打賭,對於能完成這件事,您會感到很高興,不是嗎?或者,至少如果我們的確做到了這一點,您就會高興。但是,還有一點需要指出。我們在此提供的樣本 HTA 可以檢索電腦上所安裝的作業系統的名稱,然後將其顯示在訊息框中。這很好,但是比方說您想顯示電腦上所安裝的所有服務的列表,又該怎麼辦呢?這時,您會發現自己將應答幾十個訊息框。這可不是您我所希望得到的使用者體驗。

那麼,能否解決這個問題?當然可以。我們不想在這方面多花時間,但是需要做幾件事。首先,我們在 HTA 中添加了一個 SPAN 地區;這隻是螢幕上的一個可識別的地區,可以在其中寫入資訊。使用此類代碼將 SPAN(附帶 DataArea 的 ID)放置在按鈕的下方:

<P> <span id=DataArea></span>
其次,需要收集該資料,並將其全都儲存到一個變數中,而不在一個訊息框中顯示所有資料。該代碼將變數 strText 的值設為當前在 strText 中的任何值加上“caption”屬性的值,再加上 <BR> 標記(在 HTML 指令碼中相當於按鍵盤上的“ENTER”鍵):

strText = strText & objItem.Caption & "<BR>"
最後,需要將 SPAN 的“InnerHTML”屬性設為變數 strText 的值:

DataArea.InnerHTML = strText
都明白了嗎?另外,為了避免過多的解釋,這裡有個修改過的 HTA,可以收集電腦上所安裝的所有服務的名稱,然後自動將這些名稱寫入 HTA 中:

複製代碼 代碼如下:<SCRIPT LANGUAGE="VBScript">

Sub RunScript

If ComputerOption(0).Checked Then
strComputer = ComputerOption(0).Value
End If
If ComputerOption(1).Checked Then
strComputer = ComputerOption(1).Value
End If
If ComputerOption(2).Checked Then
strComputer = ComputerOption(2).Value
End If
If ComputerOption(3).Checked Then
strComputer = ComputerOption(3).Value
End If

If strComputer = "" Then
Exit Sub
End If

Set objWMIService = GetObject _
("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery _
("Select * From Win32_Service")
For Each objItem in ColItems
strText = strText & objItem.Name & "<BR>"
Next

DataArea.InnerHTML = strText

End Sub

Sub CancelScript
Self.Close()
End Sub

</SCRIPT>

<BODY>
<input type="radio" name="ComputerOption" value="atl-ws-01">atl-ws-01<BR>
<input type="radio" name="ComputerOption" value="atl-ws-02">atl-ws-02<BR>
<input type="radio" name="ComputerOption" value="atl-ws-03">atl-ws-03<BR>
<input type="radio" name="ComputerOption" value="atl-ws-04">atl-ws-04<P>

<input id=runbutton class="button" type="button" value="Run Script" name="ok_button"
onClick="RunScript">

<input id=runbutton class="button" type="button" value="Cancel" name="cancel_button"
onClick="CancelScript">
<P>
<span id=DataArea></span>
</BODY>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.