Batch file 在批处理文件中是否有用户输入的预设数据?
所以基本上我有一个批处理文件,需要大量的用户输入。我想知道在提问时是否可能已经存在任何填充数据,如果用户需要更改某些内容,他们可以去编辑这些数据。比如说 然后用户输入他们的名字和姓氏。 但是,是否有可能以默认名称开始,用户可以返回并在需要时进行编辑 这可能不是必需的,但这是我用于用户输入的代码Batch file 在批处理文件中是否有用户输入的预设数据?,batch-file,command-line,Batch File,Command Line,所以基本上我有一个批处理文件,需要大量的用户输入。我想知道在提问时是否可能已经存在任何填充数据,如果用户需要更改某些内容,他们可以去编辑这些数据。比如说 然后用户输入他们的名字和姓氏。 但是,是否有可能以默认名称开始,用户可以返回并在需要时进行编辑 这可能不是必需的,但这是我用于用户输入的代码 Set /p "Author=Please enter your name: " 我理解,对于作者来说,预设数据没有多大意义,但在其他情况下,这样做对我很有用。可能吗?askingFile.cmd
Set /p "Author=Please enter your name: "
我理解,对于作者来说,预设数据没有多大意义,但在其他情况下,这样做对我很有用。可能吗?askingFile.cmdaskingFile.cmd < response.txt
从指定的文件中获取批次的输入,每个答案一行。下面的方法有一个不便之处,即在用户输入数据之前必须清除屏幕,但我正在努力解决这一点: 编辑:我修复了第一个版本的细节
@if (@CodeSection == @Batch) @then
@echo off
rem Enter the prefill value
CScript //nologo //E:JScript "%~F0" "First Last"
rem Read the variable
echo -----------------------------------------------------------
set /P "Author=Please enter your name: "
echo Author=%Author%
goto :EOF
@end
WScript.CreateObject("WScript.Shell").SendKeys(WScript.Arguments(0));
有关更多详细信息,请参阅。您可以先设置var,然后仅在未这样定义的情况下提示用户:
set Author=First Last
if not defined Author set /p "Author=Please enter your name: "
如果用户没有定义值,也可以反向执行此操作,例如:
set /p "Author=Please enter your name: "
if not defined Author set Author=First Last
使用纯批处理几乎不可能编辑预设值,但您可以轻松地给出一个默认值(有效,因为如果输入为空,
set/p
不接触变量)
另一种可能是使用editv32.exe或edit64.exe程序(),这使得操作非常简单:
set NAME=Gill Bates
editv32 -p "Enter your name: " NAME
editv32.exe/editv64.exe是不受版权限制的免费软件。另一种选择是ReadLine.exe:
@echo off
set NAME=First Last
for /f "delims=" %%n in ('ReadLine -p "Enter name: " -- %NAME%') do set NAME=%%n
echo You entered: %NAME%
你可以从我这里得到它。包括源代码。还有另一种方法可以实现这一点。它使用vbs脚本获取输入并将其分配给变量,-该脚本可以在.bat文件中创建并从中调用 我开发了这个方法作为从set/p接受用户输入的替代方法,以验证输入并防止设置带有空格或特殊字符的变量。 *由于与问题无关,因此省略了验证方法 最好的方法是将脚本生成器作为可以调用的辅助.bat文件,因为它允许在vbs输入框传递的信息方面有很多通用性,并且可以在一个或多个.bat文件中的任何情况下使用,以便能够控制输入默认值 在主程序中,准备获取输入时- REM定义标题:
Set inputtitle=The title you want the input box to have
REM声明要分配的变量:
Set variableforinput=VariableName
REM定义默认变量值:
Set defaultinput=VariableName's Desired Default Value
REM获取输入:
CALL "inputscript.bat" %inputtitle% %variableforinput% %defaultinput%
inputscript.bat:
@echo off
SET inputtitle=%~1
SET variableforinput=%~2
SET defaultinput=%~3
SET %variableforinput%=
SET input=
:main
成功定义REM exit和cleanup once变量后
IF DEFINED input GOTO return
REM创建并启动VBS输入框,将输入存储到文本文件中
(
ECHO Dim objFSO 'File System Object
ECHO Set objFSO = CreateObject("Scripting.FileSystemObject"^)
ECHO Dim objTS 'Text Stream Object
ECHO Const ForWriting = 2
ECHO Set objTS = objFSO.OpenTextFile("%userprofile%\getinput.txt", ForWriting,
True^)
ECHO objTS.Write(InputBox("Please enter %variableforinput% to continue.","%inputtitle%","%defaultinput%",0,0^)^)
ECHO objTS.Close(^)
ECHO Set bjFSO = Nothing 'Destroy the object.
ECHO Set objTS = Nothing 'Destroy the object.
) >GetInput.vbs
START GetInput.vbs
REM需要一个允许输入和存储时间的暂停
cls
ECHO (N)ext
CHOICE /T 20 /C nz /N /D n >nul
IF ERRORLEVEL ==2 GOTO main
IF ERRORLEVEL ==1 GOTO loadinput
:loadinput
IF NOT EXIST "%userprofile%\getinput.txt" GOTO invInput
<%userprofile%\getinput.txt (
SET /P input=
)
IF NOT DEFINED input GOTO invInput
REM结束vbs脚本,准备下次尝试提供输入
taskkill /pid WScript.exe /T >nul
Timeout 1 >nul
GOTO main
REM将输入值分配给主程序中设置的变量名
:return
SET %variableforinput%=%input%
SET input=
IF EXIST "%userprofile%\getinput.txt" (
DEL /Q "%userprofile%\getinput.txt"
)
IF EXIST "GetInput.vbs" (
DEL /Q "GetInput.vbs"
)
GOTO :EOF
我编写了一个名为
editenv
的开源Windows控制台程序,它取代了我以前的editv32
/editv64
/readline.exe
实用程序:
基本上,editenv
允许您以交互方式编辑环境变量的值。我的一个常见用例是为当前流程编辑Path
环境变量:
editenv Path
editenv
还提供以下方便功能:
允许您隐藏键入的输入(请注意,此功能不提供任何加密或安全性)--maskinput
和--allowedchars
允许您指定允许输入的字符--disallowchars
和--minlength
允许您选择输入字符串的最小和最大长度--maxlength
允许您指定一个超时,在该超时之后自动输入--timeout
这太完美了!正是我需要的@我修正了第一个版本的细节。请参阅我答案中的编辑…请注意,我不建议在生产环境中使用SendKeys方法,因为您无法保证哪个前景窗口具有焦点。在某些情况下,可能会出现这种情况。@Aacini今天发现了一个类似的问题,显然这种类型的代码在特殊字符方面存在问题。好的解决方案,但是它能否放置在包含其他代码的批处理文件的中间?我很难适应它。可能吗?Thanks@Rakha:是的。您可以在
@echo off
和goto:EOF
行之间放置任何需要的批处理代码,只需保留其余行即可…您的editenv
程序正是我多年来一直在寻找的程序。谢谢你!
:return
SET %variableforinput%=%input%
SET input=
IF EXIST "%userprofile%\getinput.txt" (
DEL /Q "%userprofile%\getinput.txt"
)
IF EXIST "GetInput.vbs" (
DEL /Q "GetInput.vbs"
)
GOTO :EOF
editenv Path