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