执行前检查批处理文件位置

时间:2015-05-13 07:01:12

标签: windows batch-file

我已经将一个批处理文件写入备份用户配置文件,但我想将其作为白痴证明。

有几次我实际上已将批处理文件留在我的桌面上并在我自己的配置文件上运行它,并且由于批处理文件包含一个robocopy命令来复制Desktop文件夹,它会在一个和另一个内部创建一个无限循环的重复文件夹由于256个字符的限制,很难摆脱。

我正在尝试让批处理文件在执行前检查自己的位置是否在用户配置文件中。

我昨晚用IF命令搞砸了,这就是我想出的:

@ECHO off
SET /P %UserName%=Enter Username: 
IF "%~dp0"=="C:\Users\%UserName%\NUL" (
GOTO ERROR
) ELSE (
GOTO PROFILEBACKUP
)

:PROFILEBACKUP
REM To Be replaced by Profile Backup Script
ECHO Correct Location

:ERROR
ECHO Move ProfileBackup.CMD to another location

但我得到的唯一输出是:

Enter Username: smithsl
Correct Location
Move ProfileBackup.CMD to another location

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

以下建议批量代码检查批处理文件的位置是否在用户的配置文件目录树中的某处。

@echo off
setlocal EnableDelayedExpansion
set "BatchPath=%~dp0"

:EnterName
rem Define as default name of current user.
set "NameOfUser=%UserName%"
set /P "NameOfUser=Enter user name (default: %NameOfUser%): "

rem Remove double quotes from entered string.
set "NameOfUser=!NameOfUser:"=!"
rem Were something different than just double quotes entered?
if "%NameOfUser%"=="" goto EnterName
rem Remove also angle brackets and exclamation marks.
set "NameOfUser=!NameOfUser:<=!"
if "%NameOfUser%"=="" goto EnterName
set "NameOfUser=!NameOfUser:>=!"
if "%NameOfUser%"=="" goto EnterName
set "NameOfUser=%NameOfUser:!=%"
if "%NameOfUser%"=="" goto EnterName
rem Starts the path of the batch file with C:\Users\entered user name?
if not "!BatchPath:C:\Users\%NameOfUser%=!" == "%BatchPath%" goto LocationError

rem To be replaced by profile backup script
echo Correct Location
endlocal
goto :EOF

:LocationError
echo Move %~nx0 to another location.
endlocal
goto :EOF

虽然有些测试用于检查无效的用户输入,但它仍然不是白痴证明,因为当用户输入内容时几乎不可能。

您所犯的错误是将输入的值分配给%UserName%,这意味着如果您的用户帐户名称是Scott,则输入的字符串将分配给名为Scott的环境变量,而不是名为UserName的环境变量。通过批处理脚本覆盖预定义的UserName环境变量值当然不是一个好主意。

打开命令提示符窗口,执行set /?并阅读打印到控制台窗口中的帮助,以了解此批处理代码中使用的字符串替换,并使用额外延迟的环境变量扩展。