Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 为什么用户可以设置新密码,而不需要使用批处理代码输入正确的旧密码?_Batch File_Compare - Fatal编程技术网

Batch file 为什么用户可以设置新密码,而不需要使用批处理代码输入正确的旧密码?

Batch file 为什么用户可以设置新密码,而不需要使用批处理代码输入正确的旧密码?,batch-file,compare,Batch File,Compare,我最近写了一个文件夹锁定程序 我唯一的问题是,当我需要更改密码时,例如,我转到newpass部分,程序似乎不会将旧密码与新密码进行比较,而只是使用任何给定的输入,这会破坏获得密码的目的,因为每个人都可以更改密码,然后用密码解锁文件夹 有人能再检查一下我的代码,告诉我为什么要这样做吗 @echo off title Folder Locker by KBKOZLEV :SETPASS set/p password= <password.txt set/p tipp= <tipp.tx

我最近写了一个文件夹锁定程序

我唯一的问题是,当我需要更改密码时,例如,我转到
newpass
部分,程序似乎不会将旧密码与新密码进行比较,而只是使用任何给定的输入,这会破坏获得密码的目的,因为每个人都可以更改密码,然后用密码解锁文件夹

有人能再检查一下我的代码,告诉我为什么要这样做吗

@echo off 
title Folder Locker by KBKOZLEV
:SETPASS
set/p password= <password.txt
set/p tipp= <tipp.txt
attrib +h +s "password.txt"
attrib +h +s "tipp.txt"
:START
if exist "Locked" goto OPEN
if exist "Unlocked" goto LOCK
if not exist "Unlocked" goto MDLOCKER
:LOCK
ren Unlocked "Locked"
attrib +h +s "Locked" 
echo.
echo Folder locked 
CHOICE /C X /T 1 /D X > nul
exit
:MDLOCKER
md Unlocked
echo( 1234 > password.txt
)
echo( 1234 > tipp.txt
)
attrib +h +s "password.txt" 
attrib +h +s "tipp.txt"
cls
echo.
echo Private folder created successfully 
CHOICE /C X /T 1 /D X > nul
goto End 
:OPEN
cls
echo.
echo Password Tip:%tipp%
echo.
echo Enter password to unlock folder or
echo Enter "new" to set a new password. 
set/p pass=">" 
if %pass%==new goto newpass
if %pass%==%password% ( 
attrib  -h -s "Locked" 
ren Locked "Unlocked"
echo Folder unlocked successfully 
goto End 
)
goto FAIL
:FAIL
cls
echo.
echo Invalid password,please try again. 
CHOICE /C X /T 1 /D X > nul 
cls
goto OPEN
:NEWPASS
cls
echo.
echo Enter old password.
set/p oldpass=">"
if %oldpass%==%password% {
attrib -h -s "password.txt"
attrib -h -s "tipp.txt"
cls 
echo.
echo Enter new password. 
set/p newpass= ">"
echo( %newpass% > password.txt
)
pause
cls
echo.
echo Enter new tipp
set/p passtipp=">"
echo( %passtipp% > tipp.txt
)
goto setpass
}
goto fail
:END
@echo关闭
KBKOZLEV的标题文件夹锁
:SETPASS
set/p password=password.txt
)
echo(1234>tipp.txt
)
attrib+h+s“password.txt”
attrib+h+s“tipp.txt”
cls
回声。
已成功创建回显专用文件夹
选项/C X/T 1/D X>nul
转到终点
:打开
cls
回声。
回显密码提示:%tipp%
回声。
echo输入密码以解锁文件夹或
echo输入“new”以设置新密码。
设置/p过程=“>”
如果%pass%==new转到newpass
如果%pass%==%password%(
属性-h-s“锁定”
已锁定“未锁定”
echo文件夹已成功解锁
转到终点
)
失败
:失败
cls
回声。
回显无效密码,请重试。
选项/C X/T 1/D X>nul
cls
去开门
:新通行证
cls
回声。
输入旧密码。
设置/p oldpass=“>”
如果%oldpass%==%password%{
attrib-h-s“password.txt”
attrib-h-s“tipp.txt”
cls
回声。
输入新密码。
设置/p newpass=“>”
echo(%newpass%>password.txt
)
暂停
cls
回声。
输入新的tipp
set/p passtipp=“>”
echo(%passtipp%>tipp.txt
)
后藤塞通
}
失败
:结束
延迟环境变量扩展 最后是重写批处理代码,以避免延迟环境变量扩展的需要,因为在
IF
块中设置环境变量,并在与中相同的块中对其进行评估

if %oldpass%==%password% (
    attrib -h -s "password.txt"
    attrib -h -s "tipp.txt"
    cls
    echo.
    echo Enter new password. 
    set/p newpass= ">"
    echo( %newpass% > password.txt
    )
    rem ...
)
命令行解释器
cmd.exe
替换
中的所有
%env%
)块,然后评估
IF
条件,例如导致
newpass
始终为空(最有可能)。输入
帮助集
设置/?
以了解延迟扩展的详细信息后,在命令提示窗口中阅读有关命令
设置
输出的整个帮助

打字错误 在您的问题的上述代码块中有
{
而不是

块缩进 您应该缩进
块中的行,否则任何人都很难看到块结构,这使得代码检查非常困难

返回时未更改的环境变量 如果用户必须输入分配给环境变量的字符串,则用户始终可以只按回车键或回车键,而不输入任何内容。在这种情况下,如果环境变量已经存在,则环境变量的值根本不会更改。因此,建议确保环境变量不存在在使用
之前,设置/p
用户是否必须输入内容

另一种可能性是,为环境变量指定了一个默认值,因此如果应该使用默认值,用户只需按RETURN或ENTER键。但在该批处理代码中,用户应始终输入所有字符串

分配给环境变量的尾随空格 可以将带有空格的字符串分配给环境变量,空格也可以位于字符串的末尾。批处理文件中的尾随空格是批处理文件无法按预期工作的常见原因。解决方案是使用set“var=value”与本例一样,在执行命令时,第二个双引号后面的尾随空格将被忽略

字符串总是与周围的双引号进行比较 应始终在环境变量引用和字符串值周围使用双引号将环境变量与字符串值进行比较。否则,如果用户不输入任何内容,则会很容易发生这种情况,因为
条件被解析为

if ==new goto newpass
这是无效的,并且
cmd.exe
会中断批处理文件的执行。在

if /i "%pass%"=="new" goto NEWPASS
/i
使比较不区分大小写

用户输入的双引号将中断批处理脚本 但是用户仍然可以通过输入双引号字符来中断批处理文件的执行。解决方案是在进行字符串比较之前,从输入的字符串中删除所有双引号,例如使用

set newpass=%newpass:"=%
但是,如果在提示用户输入新密码之前删除了
newpass
,而用户未输入任何内容,则会导致另一个问题。这将再次导致
cmd.exe
的命令行语法无效。解决方案是仅使用
作为值。现在用户可以按回车键,但变量仍将以
作为值存在。下一行将删除此双引号,批处理代码在下一行检测到用户未输入任何内容,否则单双引号将被其他内容替换

最终批次代码
非常感谢你花时间解释一切,我在几个月前就开始了,当时还不知道编码是什么,所以这个程序对我自己来说是一种挑战,看看我是否能做到。我很乐意支持你的观点。再次感谢你。
@echo off
title Folder Locker by KBKOZLEV
:SETPASS
set "tipp="
set "password="
if exist "password.txt" (
    set /p password=<password.txt
    attrib +h +s "password.txt"
)
if exist "tipp.txt" (
    set /p tipp=<tipp.txt
    attrib +h +s "tipp.txt"
)
:START
if exist "Locked" goto OPEN
if exist "Unlocked" goto LOCK
if not exist "Unlocked" goto MDLOCKER
:LOCK
ren "Unlocked" "Locked"
attrib +h +s "Locked"
echo.
echo Folder locked.
CHOICE /C X /T 5 /D X > nul
exit
:MDLOCKER
md "Unlocked"
echo>password.txt 1234
echo>tipp.txt 1234
attrib +h +s "password.txt"
attrib +h +s "tipp.txt"
cls
echo.
echo Private folder created successfully.
CHOICE /C X /T 5 /D X > nul
goto END
:OPEN
cls
echo.
echo Password tipp: %tipp%
echo.
echo Enter password to unlock folder or
echo enter "new" to set a new password.
echo.
set "pass="
set /p "pass=Password: "
if /i "%pass%"=="new" goto NEWPASS
if "%pass%"=="%password%" (
    attrib -h -s "Locked"
    ren "Locked" "Unlocked"
    echo.
    echo Folder unlocked successfully.
    goto END
)
goto FAIL
:FAIL
cls
echo.
echo Invalid password, please try again.
CHOICE /C X /T 5 /D X > nul
cls
goto OPEN
:NEWPASS
cls
echo.
set "oldpass="
set /p "oldpass=Old password: "
if not "%oldpass%"=="%password%" goto FAIL
:ENTERNEW
cls
echo.
set "newpass=""
set /p "newpass=New password: "
set newpass=%newpass:"=%
if "%newpass%"=="" (
    echo.
    echo Invalid new password, please enter new password again.
    CHOICE /C X /T 5 /D X > nul
    goto ENTERNEW
)
if exist "password.txt" attrib -h -s "password.txt"
echo>password.txt %newpass%
echo.
set "passtipp=""
set /p "passtipp=New tipp: "
set passtipp=%passtipp:"=%
if exist "tipp.txt" attrib -h -s "tipp.txt"
if not "%passtipp%"=="" (
    echo>tipp.txt %passtipp%
) else (
    del "tipp.txt"
)
goto SETPASS
:END
@echo off
setlocal EnableDelayedExpansion
title Folder Locker by KBKOZLEV
:SETPASS
set "tipp="
set "password="
if exist "password.txt" (
    set /p password=<password.txt
    attrib +h +s "password.txt"
)
if exist "tipp.txt" (
    set /p tipp=<tipp.txt
    attrib +h +s "tipp.txt"
)
:START
if exist "Locked" goto OPEN
if exist "Unlocked" goto LOCK
if not exist "Unlocked" goto MDLOCKER
:LOCK
ren "Unlocked" "Locked"
attrib +h +s "Locked"
echo.
echo Folder locked.
CHOICE /C X /T 5 /D X > nul
exit
:MDLOCKER
md "Unlocked"
echo>password.txt 1234
echo>tipp.txt 1234
attrib +h +s "password.txt"
attrib +h +s "tipp.txt"
cls
echo.
echo Private folder created successfully.
CHOICE /C X /T 5 /D X > nul
goto END
:OPEN
cls
echo.
echo Password tipp: %tipp%
echo.
echo Enter password to unlock folder or
echo enter "new" to set a new password.
echo.
set "pass=""
set /p "pass=Password: "
set "pass=!pass:"=!"
if /i "%pass%"=="new" goto NEWPASS
if "%pass%"=="%password%" (
    attrib -h -s "Locked"
    ren "Locked" "Unlocked"
    echo.
    echo Folder unlocked successfully.
    goto END
)
goto FAIL
:FAIL
cls
echo.
echo Invalid password, please try again.
CHOICE /C X /T 5 /D X > nul
cls
goto OPEN
:NEWPASS
cls
echo.
set "oldpass=""
set /p "oldpass=Old password: "
set "oldpass=!oldpass:"=!"
if not "%oldpass%"=="%password%" goto FAIL
:ENTERNEW
cls
echo.
set "newpass=""
set /p "newpass=New password: "
set "newpass=!newpass:"=!"
if "%newpass%"=="" (
    echo.
    echo Invalid new password, please enter new password again.
    CHOICE /C X /T 5 /D X > nul
    goto ENTERNEW
)
if exist "password.txt" attrib -h -s "password.txt"
echo>password.txt !newpass!
echo.
set "passtipp=""
set /p "passtipp=New tipp: "
set "passtipp=!passtipp:"=!"
if exist "tipp.txt" attrib -h -s "tipp.txt"
if not "%passtipp%"=="" (
    echo>tipp.txt !passtipp!
) else (
    del "tipp.txt"
)
goto SETPASS
:END
endlocal