具有点的批处理文件输入行

时间:2017-06-02 13:18:42

标签: batch-file input

我希望有一个解决方案,

我想知道某个善良的人是否可以帮我创建一个输入行,其中包含点作为输入字段......(每次输入一个字母时,都会替换一个点)

以下是一个例子:

@echo off
title Input with dots
set /p action = "·······················································"
if %action% == option1 goto print1
:print1
echo this works!
pause
exit

这是我到目前为止所做的,但我被卡住了。

defaultPage

2 个答案:

答案 0 :(得分:2)

您可以输出点,通过输出一堆退格字符向后移动光标,然后提示用户。要输出退格符,必须将退格捕获到变量。

[ERROR] [06/02/2017 15:30:14.966] [JobServer-akka.actor.default-dispatcher-3] [ActorSystem(JobServer)] Uncaught error from thread [JobServer-akka.actor.default-dispatcher-3] shutting down JVM since 'akka.jvm-ex$
java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
at akka.event.slf4j.Logger$.apply(Slf4jLogger.scala:30)
at akka.event.slf4j.SLF4JLogging$class.log(Slf4jLogger.scala:19)
at akka.event.slf4j.Slf4jLogger.log$lzycompute(Slf4jLogger.scala:54)
at akka.event.slf4j.Slf4jLogger.log(Slf4jLogger.scala:54)
at akka.event.slf4j.Slf4jLogger$$anonfun$receive$1.applyOrElse(Slf4jLogger.scala:80)
at akka.actor.ActorCell.receiveMessage(ActorCell.scala:498)
at akka.actor.ActorCell.invoke(ActorCell.scala:456)
at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:237)
at akka.dispatch.Mailbox.run(Mailbox.scala:219)
at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:386)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 14 more

Uncaught error from thread [JobServer-akka.actor.default-dispatcher-3] shutting down JVM since 'akka.jvm-exit-on-fatal-error' is enabled for ActorSystem[JobServer]
java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
at akka.event.slf4j.Logger$.apply(Slf4jLogger.scala:30)
at akka.event.slf4j.SLF4JLogging$class.log(Slf4jLogger.scala:19)
at akka.event.slf4j.Slf4jLogger.log$lzycompute(Slf4jLogger.scala:54)
at akka.event.slf4j.Slf4jLogger.log(Slf4jLogger.scala:54)
at akka.event.slf4j.Slf4jLogger$$anonfun$receive$1.applyOrElse(Slf4jLogger.scala:80)
at akka.actor.ActorCell.receiveMessage(ActorCell.scala:498)
at akka.actor.ActorCell.invoke(ActorCell.scala:456)
at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:237)
at akka.dispatch.Mailbox.run(Mailbox.scala:219)
at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:386)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 14 more

基于@TripeHound's excellent idea使用回车来移动文本光标,这是使用批处理功能确定以编程方式填充该行的点数的示例:

@echo off & setlocal

rem // capture backspace character to a variable
rem // credit: http://www.dostips.com/forum/viewtopic.php?p=22010#p22010
for /f %%a in ('"prompt $H&for %%b in (1) do rem"') do set "BS=%%a"

rem // cosmetic, non-functional prompt:
<NUL set /P "=Fill in the blank: .................................................."

rem // backspace 50 times (one for each dot)
for /L %%I in (1,1,50) do <NUL set /P "=%BS%"

rem // real prompt this time
set /P "response="

echo You entered "%response%".

pause
exit /b

答案 1 :(得分:1)

rojo's excellent answer上的次要变体。这不是在点上退格,而是使用回车(没有换行)来再次输出提示,点,CR和提示:

@echo off
setlocal enabledelayedexpansion

REM From https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/AUXP8XbRAJA
for /f %%a in ('copy /Z "%~dpf0" nul') do set "\r=%%a"

set "DOTS=.................................................."
set "PROMPT=Fill in the blank: "

set /p "response=%PROMPT%%DOTS%!\r!%PROMPT%"

echo You entered "%response%".

虽然正如rojo所说,如果在别处使用感叹号,使用enabledelayedexpansion可能会导致问题。一种解决方案是将此代码放入&#34;子程序&#34; (我另外传入变量以包含响应和提示):

@echo off
setlocal

call :getString answer "Fill in the blank: "
echo You entered "%answer%".
goto :eof

:getString
    setlocal enabledelayedexpansion

    REM From https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/AUXP8XbRAJA
    for /f %%a in ('copy /Z "%~dpf0" nul') do set "\r=%%a"

    set "DOTS=.................................................."
    set "PROMPT=%~2"

    set /p "response=%PROMPT%%DOTS%!\r!%PROMPT%"

    endlocal && set %1=%response%
    goto :eof

最后一行(endlocal && ...)允许我们结束局部性(和延迟扩展),同时仍然使用块中定义的环境变量的值。)

(我正在研究一种替代解决方案,使用(现在不是标准的,但很容易获得的)choice命令来逐个处理输入,但它看起来并不像是去任何地方)。