有没有办法从Windows批处理文件启动对话框?

时间:2013-04-26 07:23:24

标签: windows batch-file dialog

使用“对话框”等工具找到显示GUI对话框的bash脚本是很常见的。

enter image description here

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

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

嗯,答案取决于你认为“本机解决方案”。下面的批处理文件使用所有现代Windows版本中包含的Cscript.exe外部命令,因此我认为它有资格作为“本机解决方案”。但是,它实际上是一个混合脚本,其中包含一个JScript部件,它从Batch部件获取参数,激活弹出GUI对话框,并将结果作为错误级别返回到批处理代码。

@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

答案 2 :(得分: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

答案 3 :(得分:0)

你可以使用 WinBatch ,但是像@David Heffernan说本机批处理没什么,你不能(欢迎批处理)。

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

答案 4 :(得分:0)

虽然我同意David认为批处理本身没有任何内容,但是有一个完全原生的解决方案,只需要一个批处理文件就可以工作(没有安装/非本机工具)它需要对文件系统进行写访问。 #39; s run。

public static class ListItemHolder extends RecyclerView.ViewHolder 
 implements View.OnClickListener  {
    TextView head,desc,desc1,desc2,desc3;
    Button bookButton;

    public ListItemHolder(View itemView) {
        super(itemView);
        itemView.setOnClickListener(this);
        head = (TextView) itemView.findViewById(R.id.textViewHead);
        desc = (TextView) itemView.findViewById(R.id.textViewDesc);
        desc1 = (TextView) itemView.findViewById(R.id.textViewDesc1);
        desc2 = (TextView) itemView.findViewById(R.id.textViewDesc2);
        desc3 = (TextView) itemView.findViewById(R.id.textViewDesc3);

        this.bookButton = (Button) itemView.findViewById(R.id.bookButton);
        bookButton.setOnClickListener(this);  // change number 1
    }

    public void setDocName(String DocName) {
        head.setText(DocName);
    }

    public void setSpeciality(String Speciality) {
        desc.setText(Speciality);
    }

    public void setAddress(String Address) {
        desc1.setText(Address);
    }

    public void setExperience(String Experience) {
        desc2.setText(Experience);
    }

    public void setFees(String Fees) {
        desc3.setText(Fees);
    }

    @Override
    public void onClick(View view) {
        int position = getAdapterPosition();  // change number 2 if you need position for further work.
        switch(view.getId()){
           case R.id.bookButton:

             // do your other code here 

            break:
        }
    }
  }
}