我有一个名为cmd.dll
的批处理文件。我想签入第二个批处理文件(如果cmd.dll
存在)。 cmd.dll文件是一个“安全”文件。
例如:
# cmd.dll # REM SECURITY! completeLOGIN[198293]
@ECHO OFF GOTO :ifExist
:ifExist
if EXIST "C:\Users\%computername%\AppData\Roaming\cmd.dll" GOTO
:nextCode if NOT EXIST
"C:\Users\%computername%\AppData\Roaming\cmd.dll" GOTO :NOT
:NOT EXIST
答案 0 :(得分:0)
例如,可以使用以下批处理文件来完成此文件验证:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "SecurityFile=%APPDATA%\cmd.dll"
if exist "%SecurityFile%" if not exist "%SecurityFile%\" goto ValidateFile
echo File "%SecurityFile%" does not exist.
rem Insert here more code to handle this use case of not existing file.
goto EndBatch
:ValidateFile
(for /F usebackq^ delims^=^ eol^= %%I in ("%SecurityFile%") do (
if "%%I" == "# cmd.dll # REM SECURITY! completeLOGIN[198293]" goto FileValid
goto FileInvalid
)) 2>nul
:FileInvalid
echo File "%SecurityFile%" exists,
echo but first non-empty line is not as expected.
rem Insert here more code to handle this use case of invalid content.
goto EndBatch
:FileValid
echo File "%SecurityFile%" exists
echo and contains the expected line as first non-empty line.
:EndBatch
echo/
endlocal
pause
批处理文件首先启用命令扩展,并根据此任务的要求禁用延迟的环境变量扩展。在Windows上,此环境是默认环境,但批处理文件执行安全性是第一位的。
接下来,将使用要验证的文件的全限定名称定义一个环境变量。
第一个 IF 条件检查定义的目录中是否存在具有定义名称和扩展名的文件(或文件夹),第二个 IF 条件(如果找到的目录条目确实存在)文件而不是文件夹。
执行 FOR 循环以从现有文件中读取第一行非空行。命令 FOR 失败,并输出一条错误消息,该错误消息用2>nul
重定向到设备 NUL ,以防止在打开定义的文件以读取其内容而失败时导致该错误消息进入标签FileInvalid
下的代码。
成功打开具有读取访问权限的文本文件的命令 FOR 会依次读取一行,跳过空行和以分号开头的行,并将每一行拆分为子字符串(标记)使用常规空格和水平制表符作为分隔符,并会为每行第一空格/制表符分隔的字符串分配给指定的循环变量I
。这里不需要这种默认行为。因此,在非双引号的参数字符串中定义了一个空的定界符列表,没有行尾字符,要求用脱字符号^
来转义等号和空格,以将其解释为文字字符,而不是作为参数分隔符来获取分配给指定循环变量I
的任何非空行。
区分大小写的字符串比较用于验证具有指定字符串的已定义文件中的第一条非空行。在相等的字符串上,该文件有效,并且批处理在标签FileValid
下的行继续进行。否则, FOR 循环将退出,并跳至标签FileInvalid
下方的行,因为已定义文件中的其余行没有意义。
批处理文件在显示所有三个用例的适当消息并输出空行之后,还原了初始环境。
最后,暂停批处理文件的执行,使用户可以阅读消息。
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。
echo /?
endlocal /?
for /?
goto /?
if /?
pause /?
rem /?
setlocal /?