Проверьте, существует ли файл, и проверьте первую строку в файле - PullRequest
0 голосов
/ 02 июля 2018

У меня есть пакетный файл с именем cmd.dll. Я хочу проверить в моем втором командном файле, существует ли cmd.dll. Файл cmd.dll является файлом безопасности.

Например:

# cmd.dll # REM SECURITY! completeLOGIN[198293]

second.bat # // Преобразован в .exe

@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

1 Ответ

0 голосов
/ 13 ноября 2018

Эту проверку файла можно выполнить, например, с помощью следующего пакетного файла:

@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 /?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...