使用“对话框”等工具找到显示GUI对话框的bash脚本是很常见的。
我想写一个MS Windows批处理文件,它可以通过某种GUI元素与用户交互,比如带有一些按钮的输入框。有什么更容易/更快的方法呢?
答案 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说本机批处理没什么,你不能(欢迎批处理)。
答案 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:
}
}
}
}