批量'else'(或任何此类命令)无法使用随机设置的密码

时间:2016-10-02 20:24:27

标签: batch-file

我的代码

::Correct

@echo off

echo Password, please!

::Wrong
set p = %random%
set /p = 
if /p == %p% goto true
else goto false

        ::Correct
            :true
            echo Correct!
            pause
            exit
                       :false
                       echo Wrong! Too bad! Bye!
                       pause
                       exit

我指出这部分是错的,但我不知道如何解决它。批处理文件应该要求你输入密码(这是随机设置的),如果你猜对了“正确!”,如果你猜错了,应该说“错!太糟糕了!再见!”。现在,无论我做什么,只是说没有“其他”命令。请以有效的方式提供帮助(如果不起作用,请提供其他方式)。

2 个答案:

答案 0 :(得分:2)

许多错误。

set p = %random%

将名为 p Space 的变量设置为 Space randomnumber

=命令中set 侧的空格非常重要

set /p = 

set /p命令的语法是`set / p varname =“prompt string”请注意,间距仍然很大,而且您的代码无法指定要加载的变量。

if /p == %p% goto true

由于/p是一个字符串常量,因此变量p的内容必须与此常量(即/p)相同才能生效。 /p不是变量 - 如果是,您需要使用%/p%访问它 - 并且因为您设置的是 p 空格 p的{​​{1}}将为空,因此该命令将被解释为

%p%

现在,由于if /p == goto true /p不是相同的字符串,因此不执行命令goto,因此您不会收到错误报告。

true

孤儿else goto false else的{​​{1}}子句的语法是

else

括号的定位至关重要。第一次打开必须与if(或执行)位于同一物理行上,如果使用了else,则前面的if condition ( dothis_if_true ) else ( dothis_if_false ) 和后续if必须与) 位于同一物理行上,(关键字与括号之间必须有空格。

else

注意:一行中的初始else通常用作评论,因为它比:Correct @echo off echo Password, please! :Wrong set /a p=%random% set "pass=" set /p "pass=Your password " if not defined pass goto wrong if "%pass%"=="%p%" ( goto true ) else ( goto false ) :true echo Correct! pause exit :false echo Wrong! Too bad! Bye! pause exit 更容易输入和侵扰性更小。这个技巧在'block statement'(带括号的系列语句)中不能正常工作,因为它实际上是一个破坏的标签。

我已将::条评论更改为简单标签,因为我需要为修改后的代码使用标签。

rem

这会将::设置为参数中公式的set /a p=random 算术结果给出的字符串。这只是p,随机数为0..32767。

/a

这只是将变量%random%设置为 nothing 。插入引号以告知set "pass=" 在结束pass之后出现的任何空格将包含在指定的值中。

cmd

接受键盘输入到变量"。请注意,如果键盘的响应只是 Enter ,那么变量将保持不变,它将不会获得 nothing 的值;因此它被初始化为 nothing

的原因
set /p "pass=Your password "

如果您没有输入任何内容,请继续循环,直到收到回复为止。

pass

如果从键盘输入的字符串与所选随机数的字符串版本相同,请转到if not defined pass goto wrong ...

请注意,由于从键盘接受的字符串是不受控制的 - 它可能包含空格之类的分隔符 - 然后整个字符串用引号括起来将字符串组合在一起作为一个元素。这必须与另一方完全匹配,因此我们也需要引用该项目。这不是防弹,但它不如忽略引号那么脆弱。

您可能想尝试将提示调整为

if "%pass%"=="%p%" (
 goto true
) else (
 goto false
)

用于测试目的。这将在提示中显示密码,因此您应该比32,768中的1更有可能猜测。

答案 1 :(得分:0)

看看这个,看看差异。

@echo off
set "p=%random%"
set /p "g=Password please! "
If "%g%"=="%p%" (goto :true) else (goto :false)
:true
echo Correct!
pause
exit
:false
echo Wrong! Too bad! Bye!
pause
exit