所以基本上我有一个需要很多用户输入的批处理文件。我想知道在询问问题时是否有可能存在任何填充数据,如果用户需要更改某些内容,他们可以编辑该数据。例如
然后用户输入他们的名字和姓氏。
但是,是否可以从默认名称开始,用户可以返回并在需要时进行编辑?
这可能不是必需的,但这是我用于用户输入的代码。
Set /p "Author=Please enter your name: "
我理解作者对于预设数据没有多大意义,但是在其他情况下我会这样做很有用。有可能吗?
答案 0 :(得分:9)
几乎不可能使用纯批次编辑预设值,但您可以轻松地给出默认值(有效,因为如果输入为空,set /p
没有触及变量)
set "author=First Last"
set /p "author=Enter name or press [ENTER] for default [%author%]: "
echo %author%
答案 1 :(得分:3)
下面的方法带来的不便是在用户输入数据之前必须清除屏幕,但我正在努力解决这一点:
编辑:我修复了第一个版本的详细信息
@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));
有关详细信息,请参阅this post。
答案 2 :(得分:1)
您可以先设置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
答案 3 :(得分:1)
另一种可能性是使用editv32.exe或edit64.exe程序(http://www.westmesatech.com/editv.html),这非常简单:
set NAME=Gill Bates
editv32 -p "Enter your name: " NAME
editv32.exe / editv64.exe是不受限制的受版权保护的免费软件。
答案 4 :(得分:1)
另一种选择是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%
您可以从http://www.westmesatech.com/misctools.html获取。包含源代码。
答案 5 :(得分:1)
还有另一种方法可以实现这一目标。它使用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退出并清除
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机会在返回主输入之前进行其他输入验证。
GOTO main
:invInput
SET input=
IF EXIST "GetInput.vbs" (
DEL /Q "GetInput.vbs"
)
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
答案 6 :(得分:0)
askingFile.cmd < response.txt
从指定的文件中输入批次,每个答案一行
答案 7 :(得分:0)
我编写了一个名为editenv
的开源Windows控制台程序,该程序替代了我以前的editv32
/ editv64
/ readline.exe
实用程序:
https://github.com/Bill-Stewart/editenv
基本上,editenv
使您可以交互式地编辑环境变量的值。我的常见用例之一是为当前流程编辑Path
环境变量:
editenv Path
它还有其他一些方便的选项,例如,屏蔽键入的输入[*],限制输入长度,允许和禁止输入字符等。
最新的二进制文件在这里可用:
https://github.com/Bill-Stewart/editenv/releases
[*]输入遮罩功能不安全,并且仅为方便起见而提供。