【问题标题】:Converting batch script with GOTO to single line将带有 GOTO 的批处理脚本转换为单行
【发布时间】:2018-08-24 08:53:23
【问题描述】:

我知道这里必须使用“&”和“&&”。但是 GOTO 呢?如何使它与标签或没有标签一起工作?我希望它看起来像:echo %time% & dir & echo %time%。

@echo off
:start
cls
echo -create (create password)
echo -check (check password)
echo.
set /p PROGRAM= What do you want to do?: 
goto %PROGRAM%

:create
cls
set /p PASSWORD= What do you want your password to be?: 
echo %PASSWORD% > test.txt
pause
goto start

:check
cls
set /p PASSWORD1= What is your password?

for /f "Delims=" %%a in (test.txt) do (
set TEXT=%%a
)

if %PASSWORD1%==%TEXT% goto correct
echo you are wrong!!!
pause
goto start

:correct
echo you are right!!!
pause
goto start

【问题讨论】:

  • 不要使用goto,而是使用call :label
  • ...还有goto %program% 为什么?为什么不创建数组元素并使用选择命令给出数值呢?输入123 比输入createcheck 容易得多
  • 您计划在哪里链接命令?如果您更具体,我可以提供帮助,否则我将仅提供示例答案。最后,请注意&&& 之间有很大的区别,后者只会执行下一个命令,如果上一个命令有errorlevel 0 其中& 将运行第二个命令,无论错误级别如何。
  • 它不起作用@echo off && :start && echo -create (create password) && call :start
  • 我想从 cmd.exe /c 运行

标签: batch-file cmd


【解决方案1】:

不幸的是,如前所述,不能在命令行中使用标签。

在您问题的前提下,您最好的选择是将每个例程包含在if / else 命令中,并用无限循环替换循环开始。所以,你以这样的方式结束(“可读”原型)

for /l %a in (0) do ( 
    cls
    & echo -create (create password)
    & echo -check (check password)
    & echo/
    & set pass=
    & set p=
    & set /p p=What do you want to do?
    & cls 
    & (if !p!==create (
        set /p pass=What do you want your password to be?:
        & (echo !pass!)>test.txt
    ) else if !p!==check (
        set /p pass=What is your password?
        & set /p text=<test.txt 
        & if !pass!==!text! (
            echo You are right !!!
        ) else (
            echo You are wrong !!!
        )
    ) else (
        echo wrong command !!!
    ))
    & echo/ & pause 
)

注意事项:

  • goto :start 现在是一个无限的for /l 循环。
  • 前一个命令的延续的每个命令都需要一个&amp; 运算符。 ifelse 块内的第一个命令不应包含它。
  • 由于我们正在更改变量并在同一行中检索更改后的值,因此我们需要使用延迟扩展 (!var!)。
  • 由于将在命令行中使用延迟扩展,我们需要在 cmd 调用中包含一些开关

现在,一切都在一条线上:

cmd /e /v /c"for /l %a in (0) do ( cls & echo -create (create password) & echo -check (check password) & echo/ & set pass= & set p= & set /p p=What do you want to do? & cls & (if !p!==create ( set /p pass=What do you want your password to be?: & (echo !pass!)>test.txt ) else if !p!==check ( set /p pass=What is your password? & set /p text=<test.txt & if !pass!==!text! ( echo You are right !!! ) else ( echo You are wrong !!! ) ) else ( echo wrong command !!! )) & echo/ & pause )"

包含/e(启用扩展,通常已启用,但以防万一)、/v(启用延迟扩展)开关,以确保使用所需配置创建新的cmd 实例。

而且,无论如何,请记住,您可以编写的最长命令行是 8191 个字符。

【讨论】:

    【解决方案2】:

    我会这样做:

    for /L %a in () do ( 
        cls
        & echo 1- Create password
        & echo 2- Check password
        & echo/
        & choice /N /C 12 /M "What do you want to do? "
        & cls 
        & (if not errorlevel 2 (
            set /p "pass=What do you want your password to be?: "
            & (call echo %%pass%%)>test.txt
        ) else (
            set /p "pass=What is your password? "
            & (call echo %%pass%%)>text.txt
            & fc test.txt text.txt >nul
            & if not errorlevel 1 (
                echo You are right !!!
            ) else (
                echo You are wrong !!!
            )
        ))
        & echo/ & pause 
    )
    

    这是您必须放在命令行上的单行版本:

    for /L %a in () do (cls & echo 1- Create password & echo 2- Check password & echo/& choice /N /C 12 /M "What do you want to do? " & cls & ( if not errorlevel 2 (set /p "pass=What do you want your password to be?: " & (call echo %^pass%)>test.txt) else (set /p "pass=What is your password?: " & (call echo %^pass%)>text.txt & fc test.txt text.txt >nul & if not errorlevel 1 (echo You are right !!!) else (echo You are wrong !!!)) ) & echo/ & pause)
    

    为了在cmd.exe 调用中执行此行,只需将整行括在引号之间:

    cmd /C "for /L %a in () do ( ... pause)"
    

    使用choice 命令进行选项选择更简单。此外,这样做还允许使用if errorlevel 形式而不需要延迟扩展...同样的点适用于通过fc 命令进行密码比较。

    在 Windows 8.1 上测试

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多