VB 脚本 - 帮助使用 HTA 表单将变量设置为用户输入的值
Posted
技术标签:
【中文标题】VB 脚本 - 帮助使用 HTA 表单将变量设置为用户输入的值【英文标题】:VB Script - Help in setting variable to value of user input with HTA form 【发布时间】:2021-09-10 02:50:39 【问题描述】:示例脚本最初由 OMEGASTRIPES 在此处发布:https://pastebin.com/wZYTtT8V
并在 Stack Overflow 上通过以下链接进一步讨论:Pass two lines of text into InputBox
该脚本基本上完全符合我的需要(或至少是它的第一部分),即捕获一长串文本(包括换行符),然后我需要对其进行按摩,以便重新使用部分字符串。该脚本现在正在执行我需要的所有操作,但有一个例外。示例脚本在最后的窗口中显示用户的输入。我不想显示窗口,而只想将用户输入的值分配给一个变量。不是开发人员(只是在必要时偶尔试一下)我已经努力了几个小时来尝试实现这一目标,包括尝试使用 GetElementbyName 失败的尝试。 有人可以让我摆脱痛苦,因为我确信这将变得非常简单,但我只是不知道如何,我的研究是空白。示例脚本中的违规行位于 case 语句的第三个区域:
inputboxml = window.hta_textarea.value
window.close
以下只是我尝试(但失败)将输入值分配给变量的许多不同方法的一个示例:
inputboxml = document.getElementsByName("hta_textarea")
任何人可以提供给我的任何帮助都将得到非常感激。下面是整个示例脚本。
谢谢,史蒂夫
'Example Script
dim completed
msgbox inputboxml("Enter text:", "Multiline inputbox via HTA", "default" & vbcrlf & vbtab & "multiline" & vbcrlf & "text")
function inputboxml(prompt, title, defval)
set window = createwindow()
completed = 0
defval = replace(replace(replace(defval, "&", "&"), "<", "<"), ">", ">")
with window
with .document
.title = title
.body.style.background = "buttonface"
.body.style.fontfamily = "consolas, courier new"
.body.style.fontsize = "8pt"
.body.innerhtml = "<div><center><nobr>" & prompt & "</nobr><br><br></center><textarea id='hta_textarea' style='font-family: consolas, courier new; width: 100%; height: 580px;'>" & defval & "</textarea><br><button id='hta_cancel' style='font-family: consolas, courier new; width: 85px; margin: 10px; padding: 3px; float: right;'>Cancel</button><button id='hta_ok' style='font-family: consolas, courier new; width: 85px; margin: 10px; padding: 3px; float: right;'>OK</button></div>"
end with
.resizeto 700, 700
.moveto 100, 100
end with
window.hta_textarea.focus
set window.hta_cancel.onclick = getref("hta_cancel")
set window.hta_ok.onclick = getref("hta_ok")
set window.document.body.onunload = getref("hta_onunload")
do until completed > 0
wscript.sleep 10
loop
select case completed
case 1
inputboxml = ""
case 2
inputboxml = ""
window.close
case 3
inputboxml = window.hta_textarea.value
window.close
end select
end function
function createwindow()
rem source http://forum.script-coding.com/viewtopic.php?pid=75356#p75356
dim signature, shellwnd, proc
on error resume next
signature = left(createobject("Scriptlet.TypeLib").guid, 38)
do
set proc = createobject("WScript.Shell").exec("mshta ""about:<head><script>moveTo(-32000,-32000);</script><hta:application id=app border=dialog minimizebutton=no maximizebutton=no scroll=no showintaskbar=yes contextmenu=no selection=yes innerborder=no icon=""%windir%\system32\notepad.exe""/><object id='shellwindow' classid='clsid:8856F961-340A-11D0-A96B-00C04FD705A2'><param name=RegisterAsBrowser value=1></object><script>shellwindow.putproperty('" & signature & "',document.parentWindow);</script></head>""")
do
if proc.status > 0 then exit do
for each shellwnd in createobject("Shell.Application").windows
set createwindow = shellwnd.getproperty(signature)
if err.number = 0 then exit function
err.clear
next
loop
loop
end function
sub hta_onunload
completed = 1
end sub
sub hta_cancel
completed = 2
end sub
sub hta_ok
completed = 3
end sub
【问题讨论】:
【参考方案1】:我认为您可以只为 inputboxml 函数的输出设置一个变量,而不是将该输出直接发送到 msgbox。
' instead of this
'msgbox inputboxml("Enter text:", "Multiline inputbox via HTA", "default" & vbcrlf & vbtab & "multiline" & vbcrlf & "text")
' use this
dVal = inputboxml("Enter text:", "Multiline inputbox via HTA", "default" & vbcrlf & vbtab & "multiline" & vbcrlf & "text")
msgbox dVal
我添加了一个消息框来检查结果是否相同。
【讨论】:
嗨,Doofus,非常感谢您的建议。但是,除非我犯了一个愚蠢的错误(我认为我没有犯),否则我认为您的建议不起作用!除了在开始时设置 dVal 外,我还用消息框替换了“案例 3”区域中的两行,结果显示为空白!请原谅我的提问,但是您是否使用我提供的示例代码测试了您的答案,如果是,它在您的机器上是否有效?亲切的问候史蒂夫 嗨史蒂夫。我确实使用您的代码进行了测试,并且确实有效。我的目标是尽可能少地修改你所拥有的。我没有做的是在使用 dVal 变量之前对其进行调暗,因此它不适用于任何 Sub 例程。在dVal =
行之前添加Dim dVal
。与 Completed
变量进行比较,该变量在开头是 Dim
'd,在 Sub 中可用。
史蒂夫,很抱歉,您在评论中说您试图从函数中的Select Case
访问 dVal 变量。我第一次读错了,以为你指的是Sub hta_ok
。我认为您仍然无法在函数内访问 dVal,因为它将根据函数返回的内容进行设置。您需要将案例 3 中的原始两行放回原处,它们将设置函数的输出并关闭 HTA 窗口,因此很重要。将您的 msgbox 放入 hta_ok 子中。
嗨,Doofus,好久没来了。最后,我找到了一个在 PowerShell 中完成我需要的示例,但如果我可以让它在 VB 脚本中工作会更好。我会尝试您的建议,因为最近对我的 PC 环境的更改意味着无论如何我都需要重新编写该脚本。非常感谢您回复我,很抱歉我的回复延迟了。以上是关于VB 脚本 - 帮助使用 HTA 表单将变量设置为用户输入的值的主要内容,如果未能解决你的问题,请参考以下文章
ProgressBar 在 VBScript HTA 中没有得到刷新