Batch file 批处理文件:请求用户使用“输入”;“建议”;

Batch file 批处理文件:请求用户使用“输入”;“建议”;,batch-file,Batch File,我如何提示用户回答,建议他们可以编辑的内容? 我知道如何做问答,比如: 1. The sky is: 用户输入答案,然后: echo For you the sky is %var% 但我想要的是: 1. The sky is: Blue echo For you the sky is Blue 但是用户可以更改它 1. The sky is: Green echo For you the sky is Green 我不知道我是否清楚,如果不清楚请告诉我。 谢谢 如果用户输入为

我如何提示用户回答,建议他们可以编辑的内容? 我知道如何做问答,比如:

1. The sky is:
用户输入答案,然后:

echo For you the sky is %var%
但我想要的是:

    1. The sky is: Blue

echo For you the sky is Blue
但是用户可以更改它

1. The sky is: Green
echo For you the sky is Green
我不知道我是否清楚,如果不清楚请告诉我。 谢谢

如果用户输入为空,预定义的%x%将复制到输出变量%y%


如果用户输入为空,预定义的%x%将复制到输出变量%y%

在使用颜色初始化变量之前:

@echo off&setlocal
set "color=Blue"
set/p "color=For you the sky is %color% (hit enter for o.k. or type in other color): "
echo For you the sky is %color%

在使用颜色之前初始化变量:

@echo off&setlocal
set "color=Blue"
set/p "color=For you the sky is %color% (hit enter for o.k. or type in other color): "
echo For you the sky is %color%

您可以通过JScript或VBScript使用WScript.Shell来模拟按键。试试看。我想这正是你想要的。它将发送不可编辑的
1。天空是:
然后模拟用户的蓝色按键。然后,用户可以自由地点击回车键,也可以退格删除“蓝色”,并根据自己的意愿替换它

使用
.bat
扩展名保存此文件并运行它

@if (@a==@b) @end /*

:: batch portion

@echo off
setlocal

set /p "=1. The sky is: "<NUL
call :sendkeys Blue
set /p "sky="

echo For you the sky is %sky%.  Press any key to exit.
pause >NUL

exit /b

:sendkeys <string>
cscript /nologo /e:jscript "%~f0" "%~1"
goto :EOF

:: JScript portion */
var sh = new ActiveXObject("WScript.Shell");
sh.SendKeys(WSH.Arguments(0));
@if(@a==@b)@end/*
::批量部分
@回音
setlocal
设置/p“=1。天空为:“NUL
退出/b
:发送键
cscript/nologo/e:jscript“%~f0”“%~1”
后藤:EOF
::JScript部分*/
var sh=新的ActiveXObject(“WScript.Shell”);
sh.SendKeys(WSH.Arguments(0));

您可以通过JScript或VBScript使用WScript.Shell来模拟按键。试试看。我想这正是你想要的。它将发送不可编辑的
1。天空是:
然后模拟用户的蓝色按键。然后,用户可以自由地点击回车键,也可以退格删除“蓝色”,并根据自己的意愿替换它

使用
.bat
扩展名保存此文件并运行它

@if (@a==@b) @end /*

:: batch portion

@echo off
setlocal

set /p "=1. The sky is: "<NUL
call :sendkeys Blue
set /p "sky="

echo For you the sky is %sky%.  Press any key to exit.
pause >NUL

exit /b

:sendkeys <string>
cscript /nologo /e:jscript "%~f0" "%~1"
goto :EOF

:: JScript portion */
var sh = new ActiveXObject("WScript.Shell");
sh.SendKeys(WSH.Arguments(0));
@if(@a==@b)@end/*
::批量部分
@回音
setlocal
设置/p“=1。天空为:“NUL
退出/b
:发送键
cscript/nologo/e:jscript“%~f0”“%~1”
后藤:EOF
::JScript部分*/
var sh=新的ActiveXObject(“WScript.Shell”);
sh.SendKeys(WSH.Arguments(0));

正如其他答案所说,您必须需要第三方实用程序来解决此问题。例如,我使用GetKey.exe和Show.exe辅助程序来编写ReadLine.bat,这是一个模拟
SET/P
命令的子例程,也就是说,它在按下Enter键之前一直读取字符,并使用BackSpace键删除最后一个字符。我们可以修改该例程,以便为输入变量提供初始值:

@echo off

rem Read a variable with an initialized value
rem Antonio Perez Ayala

set Bell=7
set BackSpace=8
set Enter=13
set Space=32

:ReadInitVar var="prompt" ["initial value"]
rem          %1   %2        %3

setlocal EnableDelayedExpansion
Show %2
set len=0
if "%~3" equ "" (
   set %1=
) else (
   Show %3
   set "%1=%~3"
   for /L %%i in (0,1,80) do if "!%1:~%%i,1!" neq "" set /A len+=1
)

:nextKey
   GetKey
   set key=%errorlevel%
   if %key% geq %Space% (
      rem Ascii character: insert it
      Show %key%
      for /F "delims=" %%a in ('Show %key%') do set "%1=!%1!%%a"
      set /A len+=1
   ) else if %key% equ %BackSpace% (
      rem Backspace: delete last character
      if defined %1 (
         Show %BackSpace% %Space% %BackSpace%
         set "%1=!%1:~0,-1!"
         set /A len-=1
      ) else (
         rem Empty value
         Show %Bell%
      )
   )
if %key% neq %Enter% goto nextKey
echo/
for /F "delims=" %%a in ("!%1!") do endlocal & set %1=%%a
exit /B
这样,您可以使用以下行来解决问题:

call :ReadInitVar color="For you the sky is " "Blue"
您可以从以下站点下载Getkey.exe和Show.exe辅助程序,并查看原始ReadLine.bat子例程:


还有另一个子例程类似于上面的ReadInitVar.bat,但它使用ColorShow.exe辅助程序而不是Show.exe,以不同的颜色字段显示用户输入。您可以在此处查看:

正如其他答案所述,您必须需要第三方实用程序来解决此问题。例如,我使用GetKey.exe和Show.exe辅助程序来编写ReadLine.bat,这是一个模拟
SET/P
命令的子例程,也就是说,它在按下Enter键之前一直读取字符,并使用BackSpace键删除最后一个字符。我们可以修改该例程,以便为输入变量提供初始值:

@echo off

rem Read a variable with an initialized value
rem Antonio Perez Ayala

set Bell=7
set BackSpace=8
set Enter=13
set Space=32

:ReadInitVar var="prompt" ["initial value"]
rem          %1   %2        %3

setlocal EnableDelayedExpansion
Show %2
set len=0
if "%~3" equ "" (
   set %1=
) else (
   Show %3
   set "%1=%~3"
   for /L %%i in (0,1,80) do if "!%1:~%%i,1!" neq "" set /A len+=1
)

:nextKey
   GetKey
   set key=%errorlevel%
   if %key% geq %Space% (
      rem Ascii character: insert it
      Show %key%
      for /F "delims=" %%a in ('Show %key%') do set "%1=!%1!%%a"
      set /A len+=1
   ) else if %key% equ %BackSpace% (
      rem Backspace: delete last character
      if defined %1 (
         Show %BackSpace% %Space% %BackSpace%
         set "%1=!%1:~0,-1!"
         set /A len-=1
      ) else (
         rem Empty value
         Show %Bell%
      )
   )
if %key% neq %Enter% goto nextKey
echo/
for /F "delims=" %%a in ("!%1!") do endlocal & set %1=%%a
exit /B
这样,您可以使用以下行来解决问题:

call :ReadInitVar color="For you the sky is " "Blue"
您可以从以下站点下载Getkey.exe和Show.exe辅助程序,并查看原始ReadLine.bat子例程:


还有另一个子例程类似于上面的ReadInitVar.bat,但它使用ColorShow.exe辅助程序而不是Show.exe,以不同的颜色字段显示用户输入。您可以在此处查看:

否-不清楚-您是在问如何将“蓝色”更改为“蓝色”还是将“绿色”更改为“绿色”?不是:我希望在同一行“天空是:蓝色”中有一个问题和默认答案,但我希望用户可以将“蓝色”一词更改为另一个,并将其保存在变量中,或者保留“蓝色”一词默认情况下,您不能在批处理文件中执行此操作。不-不清楚-您是在询问如何将“蓝色”更改为“蓝色”还是将“绿色”更改为“绿色”?不是:我希望在同一行“天空是:蓝色”中有一个问题和默认答案,但我希望用户可以用另一个单词更改“蓝色”并将其保存在变量中,或者保留“蓝色”一词默认情况下,您无法在批处理文件中执行此操作。我无法删除“天空是[blue]”中的[blue]变量,因此这是一个正常的问答。感谢这只能通过操纵键盘缓冲区来实现。本机方法无法做到这一点-你需要一个外部程序或实用程序来实现这一点-或者更好:用“真正的”编程语言来编程整个过程。我不能删除“天空是[蓝色]”中的[蓝色]变量,这样就成了一个普通的问题-答案。感谢这只能通过操纵键盘缓冲区来实现。用本地方法是无法做到这一点的——你需要一个外部程序或实用程序来实现这一点——或者更好:用一种“真正的”编程语言来编程。谢谢,但这也是一种经典的问答方式,我想直接在同一行中更改答案,而不是看到“对你来说,天空是蓝的:绿的”如果没有外部程序,你不能批量完成。谢谢,但这是另一个经典的问答方式,我想直接在同一行中更改答案,而不是看到“天是蓝的:绿的”。没有外部程序,你不能批量完成。如果(@a==@b)@end/*,
@if(@a=@b)是什么@end
行什么也不做,但是
/*
在JScript中开始一个多行注释。看,这是一个混合脚本,一个脚本包含两种语言。批处理将运行一半,直到
cscript thisfile.bat
重新运行相同的脚本,但使用JScript解释器。JScript将第一行计算为false,将所有批处理代码计算为多行注释,并在脚本底部附近遇到
*/
时开始工作。第一行是on