为什么我的批处理脚本不起作用......?

时间:2016-10-10 02:11:24

标签: batch-file

我是新来的。

我正在尝试制作一个可以更改密码的简单批处理脚本。当我执行它时,密码永远不会匹配,并重新启动脚本。 (我在Windows 7上)

@echo off
:Start
cls
set /p newpass=What would you like your new password to be? 
set /p passconfirm=Please retype your new password. 
if %passconfirm% == %newpass% goto True
cls
echo Your passwords do not match, restarting script.
pause
goto Start

:True 
echo %username%
set /p user=Is this the account you wish to change the password? 
if 
%user% == Yes 
goto True1 
cls
set /p user= Please enter the username that you wish to change the password for. 
goto True1


:True1 
cls
net user %user% %newpass%
echo Your password has been changed. 
pause 
Exit

2 个答案:

答案 0 :(得分:0)

IF "%passconfirm%"=="%newpass%" goto True

语法是特定的,if parm op parm dothis - 所有在一行(所以这个问题将在稍后的脚本中重复)。引号为输入中的空格提供了一些保护。

通常,您将从命令提示符运行批处理文件。只需将命令放入文件名 something .bat,然后使用 从提示符运行。请注意,您的Exit命令将终止cmd实例。如果删除它,您将返回提示符。

cls清除屏幕。如果您在pause之前放置cls,那么您将能够看到该指令的结果。

答案 1 :(得分:0)

以下是批量代码改进后最有可能按预期工作:

@echo off
rem Setup a local environment for this batch script.
setlocal EnableDelayedExpansion

:EnterPassword
cls
rem Clear entered password from previous run kept when
rem user of batch file just hits key RETURN or ENTER.
set "NewPassword="
set "ConfirmPassword="

rem Prompt the user twice for the password.
set /P "NewPassword=What would you like as new password? "
set /P "ConfirmPassword=Please retype your new password:     "

rem First check if user entered anything at all.
if "!NewPassword!" == "" goto EnterPassword
rem Next check if user entered the same string twice.
if "!ConfirmPassword!" == "!NewPassword!" goto PasswordConfirmed
echo.
echo Your passwords do not match, restarting script.
echo.
pause
goto EnterPassword

:PasswordConfirmed
echo.
echo Current user accout name is: %username%
echo.

rem Define Y as default answer for next prompt and define
rem the current user name as user to change the password for.
set "UserPrompt=Y"
set "User=%USERNAME%"

set /P "UserPrompt=Is this the account you wish to change the password (Y/n)? "

rem Compare case-insenstive the answer with Y and with YES.
if /I "!UserPrompt!" == "y"   goto SetPassword
if /I "!UserPrompt!" == "yes" goto SetPassword

echo.
echo Please enter the user name that you wish to change the password for.
echo.
set /P "User=User name: "

:SetPassword
cls
rem %SystemRoot%\System32\net.exe user "!user!" "!NewPassword!"
if not errorlevel 1 echo Your password has been changed.
echo.
endlocal
pause
exit /B

Start是一个内部命令。因此,建议不要使用此字符串作为标签名称,尽管这是可能的。

不带参数Exit

/B总是退出当前的命令进程,这使得调试批处理文件变得困难。

要调试此批处理文件,请在保存批处理文件之前删除第一行,然后打开命令提示符窗口并在此窗口中运行批处理文件,方法是键入其名称,并用双引号括起完整路径。例如,如果此批处理文件存储在名为Change Password.bat的桌面上,则需要在命令提示符窗口中运行

"%USERPROFILE%\Desktop\Change Password.bat"

批处理文件正常工作后,再次在顶部插入@echo off,然后从命令/B中删除exit,出于安全考虑,此处有用。

双击批处理文件会导致cmd.exe执行选项/C,这意味着批处理终止后关闭,因此无法读取Windows命令处理器输出的语法错误消息。打开命令提示符窗口会导致使用选项cmd.exe执行/K,这意味着在批处理终止后保持命令进程运行,从而可以查看错误消息。在命令提示符窗口cmd /?中运行,以获取有关Windows命令处理器的可用选项的帮助。

当批处理文件的用户在提示输入字符串时仅按 RETURN ENTER 时,如果之前未定义,则仍未定义环境变量,或者如果已经保留其值,则保留其值定义。此行为用于检查用户是否完全输入新密码并为其他用户提示定义默认值。

相关代码中的此块导致执行时出现语法错误:

if
%user% == Yes
goto True1

语法错误总是立即退出批处理,因为在命令提示符窗口中运行没有@echo off的批处理文件时可以看到它。

在YES / NO用户提示符上检查答案时,应始终对比较进行不区分大小写,这意味着在字符串比较中使用参数/I

用户输入并分配给本地环境变量的字符串使用延迟扩展来引用,以防止在用户输入包含特殊字符(如双引号或尖括号)的字符串时退出批处理或不需要的批处理。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • cls /?
  • echo /?
  • endlocal /?
  • exit /?
  • goto /?
  • if /?
  • pause /?
  • rem /?
  • set /?
  • setlocal /?