使用诸如“对话框”之类的工具来查找显示 GUI 对话框的 bash 脚本是很常见的。
我想编写一个 MS Windows 批处理文件,它可以通过某种 GUI 元素(如带有一些按钮的输入框)与用户交互。什么是更简单/更快的方法?
使用诸如“对话框”之类的工具来查找显示 GUI 对话框的 bash 脚本是很常见的。
我想编写一个 MS Windows 批处理文件,它可以通过某种 GUI 元素(如带有一些按钮的输入框)与用户交互。什么是更简单/更快的方法?
Windows 批处理中没有任何内容可以让您构建 GUI。
好吧,答案取决于您认为什么是“本机解决方案”。下面的批处理文件使用所有现代 Windows 版本中包含的 Cscript.exe 外部命令,因此我认为它有资格作为“本机解决方案”。然而,它确实是一个混合脚本,包括一个从批处理部分获取参数、激活弹出 GUI 对话框并将结果作为错误级别返回给批处理代码的 JScript 部分。
@if (@CodeSection == @Batch) @then
@echo off
rem Popup.bat: Example of use of Popup JScript method
rem Antonio Perez Ayala
rem http://msdn.microsoft.com/en-us/library/x83z1d9f(v=vs.84).aspx
rem Include auxiliary values for Popup JScript method
call Popup.inc
rem Call Popup JScript method with a 7 second timeout.
set /A buttons=YesNoandCancel + QuestionMark
CScript //nologo //E:JScript "%~F0" "Question:" "Do you feel alright?" /B:%buttons% /T:7
set btn=%errorlevel%
if %btn% equ %YesButton% (
rem Yes button pressed.
echo Glad to hear you feel alright.
) else if %btn% equ %NoButton% (
rem No button pressed.
echo Hope you're feeling better soon.
) else if %btn% equ %TimedOut% (
rem Timed out.
echo Is there anybody out there?
)
goto :EOF
End of Batch section
@end
// JScript section
// Displays text in a pop-up message box.
// CScript //nologo //E:JScript "%~F0" ["Title" ["Text"]] [/B:ButtonsType]
[/T:SecondsToWait]
// set ButtonClicked=%errorlevel%
var title = "", text = "", buttons = 0, seconds = 0;
var args = WScript.Arguments;
if ( args.Unnamed.Length >= 1 ) title = args.Unnamed.Item(0);
if ( args.Unnamed.Length >= 2 ) text = args.Unnamed.Item(1);
if ( args.Named.Exists("B") ) {
buttons = parseInt(args.Named.Item("B"));
}
if ( args.Named.Exists("T") ) {
seconds = parseInt(args.Named.Item("T"));
}
var WshShell = WScript.CreateObject("WScript.Shell");
WScript.Quit(WshShell.Popup(text,seconds,title,buttons));
Popup JScript 方法显示需要用户回复的弹出消息框。该方法在ButtonsType参数和buttonClicked返回值中使用了某些数值;您可以通过调用其伴随的 Popup.inc.bat 文件来定义包含这些值的辅助变量:
rem Popup.inc.bat: Define auxiliary variables for Popup JScript method
rem Antonio Perez Ayala
rem Button Types
set i=0
for %%a in (OK OKandCancel AbortRetryandIgnore
YesNoandCancel YesandNo
RetryandCancel CancelTryAgainandContinue) do (
set %%a=!i!
set /A i+=1
)
rem Icon Types
set i=16
for %%a in (StopMark QuestionMark ExclamationMark InformationMark) do (
set %%a=!i!
set /A i+=16
)
rem Default Button
set i=256
for %%a in (DefaultButton2 DefaultButton3) do (
set %%a=!i!
set /A i+=256
)
rem Button Clicked
set TimedOut=-1
set i=1
for %%a in ( OKButton CancelButton AbortButton RetryButton IgnoreButton
YesButton NoButton _ _ TryAgainButton ContinueButton ) do (
set %%a=!i!
set /A i+=1
)
set _=
set i=
rem Popup.inc.bat: End of file
Jscript 程序可以通过 DynamicWrapperX 使用其他类型的 Win-32 对话框: http ://www.script-coding.com/dynwrapx_eng.html
如果在新窗口中弹出 GUI 界面而不是受限于命令提示符窗口本身是可以接受的,请查看 HTML 应用程序 (HTA)
http://en.wikipedia.org/wiki/HTML_Application
它是标准的 Windows 技术,使用 IE 引擎在类似浏览器的窗口(无工具栏)中呈现 HTML,并提供您可能想要的所有 GUI。
很好的介绍 - “极端改造:在 GUI 界面中包装你的脚本”
http://technet.microsoft.com/en-us/library/ee692768.aspx
虽然我同意 David 的观点,即批处理本身没有任何内容,但有一个完全本地的解决方案,只需要一个批处理文件即可工作(无需安装/非本地工具)它需要对文件系统的写访问权限(如果它运行)。
@ECHO OFF
SET WINDOWTITLE="Enter Ip Address"
SET QUESTION="Answer the question being asked"
SET DETAIL="Description"
SET DEFAULTANSWER="10.45.76.156"
REM name the vbs file the same as this batch file except .vbs
set FILENAME=%~n0
REM echo the vbs
echo MSG = InputBox(%QUESTION% ^& VBCRLF ^& VBCRLF ^& VBCRLF ^& %DETAIL%, %WINDOWTITLE%, %DEFAULTANSWER%) >> "%~dp0\%FILENAME%.vbs"
echo CreateObject("Scripting.FileSystemObject").OpenTextFile("%~dp0\answer.txt",2,True).Write MSG >> "%~dp0\%FILENAME%.vbs"
cscript "%~dp0\%FILENAME%.vbs"
del "%~dp0\%FILENAME%.vbs"
SET /P answer=<"%~dp0\answer.txt"
del "%~dp0\answer.txt"
echo you typed "%answer%"
echo.
pause
您可以使用WinBatch,但就像@David Heffernan 所说的原生 Batch 没有什么,您不能(欢迎使用 Batch)。