Эту проверку файла можно выполнить, например, с помощью следующего пакетного файла:
@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 , если найденная запись каталога действительно является файлом а не папка.
Цикл
A FOR выполняется для чтения первой непустой строки из существующего файла. Команда FOR завершается неудачно и выводит сообщение об ошибке, перенаправленное с помощью 2>nul
на устройство NUL , чтобы подавить его, если открытие определенного файла для чтения его содержимого завершится неудачно, что приведет к падению кода ниже метки FileInvalid
.
Команда FOR при успешном открытии текстового файла с доступом для чтения будет читать одну строку за другой, пропускать пустые строки и строки, начинающиеся с точки с запятой, разбивать каждую строку на подстроки (токены ) с использованием обычного пробела и горизонтальной табуляции в качестве разделителей и присваивает каждой строке первую пробел / строку, разделенную табуляцией, указанной переменной цикла I
. Это поведение по умолчанию здесь не требуется. По этой причине пустой список разделителей и символы конца строки не определены в строке аргумента, не заключенной в двойные кавычки, что требует экранирования знака равенства и пробела с символом вставки ^
, которые должны интерпретироваться как литеральные символы, а не как разделители аргументов, чтобы получить любой не пустая строка присваивается указанной переменной цикла I
.
Сравнение строк с учетом регистра используется для проверки первой непустой строки в заданном файле с указанной строкой. Для одинаковых строк файл действителен, и пакетное выполнение продолжается в строке ниже метки FileValid
. В противном случае цикл FOR завершается с переходом на строку ниже метки FileInvalid
, поскольку оставшиеся строки в определенном файле не представляют интереса.
Пакетный файл восстанавливает исходную среду после отображения соответствующего сообщения для всех трех вариантов использования и вывода пустой строки.
Наконец, выполнение пакетного файла прекращается, чтобы дать пользователю возможность прочитать сообщение.
Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.
echo /?
endlocal /?
for /?
goto /?
if /?
pause /?
rem /?
setlocal /?