1

使用诸如“对话框”之类的工具来查找显示 GUI 对话框的 bash 脚本是很常见的。

在此处输入图像描述

我想编写一个 MS Windows 批处理文件,它可以通过某种 GUI 元素(如带有一些按钮的输入框)与用户交互。什么是更简单/更快的方法?

4

5 回答 5

1

Windows 批处理中没有任何内容可以让您构建 GUI。

于 2013-04-26T08:45:00.370 回答
1

好吧,答案取决于您认为什么是“本机解决方案”。下面的批处理文件使用所有现代 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

于 2013-04-27T03:24:43.290 回答
1

如果在新窗口中弹出 GUI 界面而不是受限于命令提示符窗口本身是可以接受的,请查看 HTML 应用程序 (HTA)
http://en.wikipedia.org/wiki/HTML_Application

它是标准的 Windows 技术,使用 IE 引擎在类似浏览器的窗口(无工具栏)中呈现 HTML,并提供您可能想要的所有 GUI。

很好的介绍 - “极端改造:在 GUI 界面中包装你的脚本”
http://technet.microsoft.com/en-us/library/ee692768.aspx

于 2013-04-28T08:20:20.260 回答
1

虽然我同意 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
于 2017-06-16T10:59:37.937 回答
0

您可以使用WinBatch,但就像@David Heffernan 所说的原生 Batch 没有什么,您不能(欢迎使用 Batch)。

http://www.winbatch.com/quickstart.html

于 2013-04-26T13:09:35.703 回答