无论如何在批处理文件中有用户输入的预设数据吗?

时间:2014-05-08 17:50:42

标签: batch-file command-line

所以基本上我有一个需要很多用户输入的批处理文件。我想知道在询问问题时是否有可能存在任何填充数据,如果用户需要更改某些内容,他们可以编辑该数据。例如

enter image description here 然后用户输入他们的名字和姓氏。 enter image description here

但是,是否可以从默认名称开始,用户可以返回并在需要时进行编辑?

这可能不是必需的,但这是我用于用户输入的代码。

Set /p "Author=Please enter your name: "

我理解作者对于预设数据没有多大意义,但是在其他情况下我会这样做很有用。有可能吗?

8 个答案:

答案 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

[*]输入遮罩功能不安全,并且仅为方便起见而提供。