#vbscript #hta
#vbscript #hta
Вопрос:
Я настроил hta VBScript, чтобы мои пользователи могли выбирать принтер по умолчанию. В настоящее время я пытаюсь сделать это как можно более понятным визуально.
Наши принтеры перечислены как похожие на:
4th floor
1st floor
Block 2
3rd floor
etc.
Кто-нибудь знает об изменении, которое я мог бы внести в код для сортировки выходных данных по имени? Большое спасибо
<html>
<head>
<title>Choose your default printer</title>
<style type="text/css">
body {
font-family:Verdana;
font-size: 12px;
color: #49403B;
background: #FFFFFF;
text-align: center;
}
</style>
<SCRIPT Language="VBScript">
Sub Window_Onload
window.resizeTo 500,550
strComputer = "."
Set objWMIService = GetObject("winmgmts:\" amp; strComputer amp; "rootcimv2")
Set colPrinters = objWMIService.ExecQuery("Select * From Win32_Printer")
Set re = New RegExp
re.Pattern = "^\\.*?\"
For Each objPrinter in colPrinters
strPrinter = objPrinter.Name
Set objOption = Document.createElement("OPTION")
objOption.Text = re.Replace(strprinter, "")
objOption.Value = strPrinter
If objPrinter.Default Then objOption.Selected = True
AvailablePrinters.Add(objOption)
Next
End Sub
Sub SetDefault
strPrinter = AvailablePrinters.Value
Set WshNetwork = CreateObject("Wscript.Network")
WshNetwork.SetDefaultPrinter strPrinter
Msgbox strprinter amp; " has been set as your default printer."
End Sub
</SCRIPT>
Click a printer name to set it as your default<p>
<select size="20" name="AvailablePrinters" onChange="SetDefault"></select>
<p>
Close this window when done
Ответ №1:
Я бы использовал an ArrayList
и a Dictionary
, например:
Set printerNames = CreateObject("System.Collections.ArrayList")
Set printers = CreateObject("Scripting.Dictionary")
For Each objPrinter in colPrinters
name = re.Replace(objPrinter.Name, "")
printerNames.Add name
printers.Add name, objPrinter
Next
printerNames.Sort
For Each name in printerNames
Set objOption = Document.createElement("OPTION")
objOption.Text = name
objOption.Value = printers(name).Name
If printers(name).Default Then objOption.Selected = True
AvailablePrinters.Add(objOption)
Next
Комментарии:
1. Не могли бы вы сообщить мне, в какой момент это должно быть вставлено в существующий код? Большое спасибо
2. @ITadminguy Приведенный выше код заменяет
For Each
цикл в вашем HTA.
Ответ №2:
Вы можете добавить имена принтеров в массив, а затем использовать простую пузырьковую сортировку. Единственная сложность заключается в том, что вы также получаете принтер по умолчанию. Поэтому вам придется сохранить это при повторении вашей Win32_Printer
коллекции.
' Create an array to hold the printer names...
ReDim a(colPrinters.count - 1)
' Add each printer name to the array. Also, save the name of the default printer.
Dim i, strDefault
For Each objPrinter In colPrinters
a(i) = objPrinter.Name
If objPrinter.Default Then strDefault = objPrinter.Name
i = i 1
Next
' Sort the array...
Sort a
For i = 0 To UBound(a)
' Create your <option>...
If a(i) = strDefault Then objOption.Selected = True
Next
' Basic bubble sort...
Sub Sort(a)
Dim i, j, temp
For i = UBound(a) - 1 To 0 Step -1
For j = 0 To i
If a(j) > a(j 1) Then
temp = a(j 1)
a(j 1) = a(j)
a(j) = temp
End If
Next
Next
End Sub
Ответ №3:
Вот фрагмент кода, который считывает данные из stdin, добавляет к отключенному набору записей, сортирует набор записей, считывает и записывает в стандартный вывод.
With rs
.Fields.Append "SortKey", 201, 260
.Fields.Append "Txt", 201, 5000
.Open
Do Until Inp.AtEndOfStream
Lne = Inp.readline
SortKey = Mid(Lne, Arg(3), Arg(4) - Arg(3))
.AddNew
.Fields("SortKey").value = SortKey
.Fields("Txt").value = Lne
.UpDate
Loop
If Arg(2) = "a" then SortColumn = "SortKey ASC"
If Arg(2) = "d" then SortColumn = "SortKey DESC"
.Sort = SortColumn
Do While not .EOF
Outp.writeline .Fields("Txt").Value
.MoveNext
Loop
End With
или вы можете использовать отсортированный массив / коллекцию .net.
Set sortthing = CreateObject("System.Collections.SortedList")
См. Раздел Класс SortedList в документах .NET framework.