Я нашел несколько решений этой проблемы, но, к сожалению, ни один из них не работает на моем окне Windows.

Я запускаю цикл FOR в пакетном файле, чтобы просмотреть несколько текстовых файлов. Для каждого текстового файла я хочу ECHO его имя (и, возможно, перенаправить вывод в файл), если grep (из WinGNU) возвращает строку. Быстрый поиск Google показывает мне, чтобы сделать это следующим образом:

IF grep -c pattern file ( stuff )

Однако это выдает ошибку

-c was unexpected at this time.

В качестве альтернативы я решил использовать код выхода из grep --quiet следующим образом:

grep -q pattern file
IF ERRORLEVEL 1 ( stuff )

Это всегда не проходит тест IF, даже если grep успешен.

Есть ли хороший способ выполнить условный оператор в Windows, если мой grep находит совпадение?

Мой код:

SET locations=( a, long, list, of, last, two, octets )
SETLOCAL ENABLEDELAYEDEXPANSION

FOR %%r IN %locations% DO (
    grep -i "^\[CardSwipe\]" \\10.0.%%r\path\to\file.ini
    IF ERRORLEVEL 1 echo %%r

Мой вывод:

[this line left intentionally blank] :)

1 ответ1

1

Я не могу придумать хороший способ сделать это с помощью Batch, особенно если учесть, что вы используете не родные инструменты командной строки, с которыми я не знаком. Однако PowerShell, как правило, намного лучше подходит для таких задач, как эта.

Это должно сделать работу за вас в PowerShell:

$Hosts = @('1.1','1.2','101.243','54.28')
$Hosts | ForEach-Object {
    if ((Get-Content "\\10.0.$_\path\to\file.ini" | Select-String "^\[CardSwipe\]").length -ne 0) {
        Write-Output $_}}

Вот разбивка:

  1. Мы определяем $Hosts как массив, содержащий строки, которые представляют последние два октета каждой проверяемой системы. Альтернативный метод установки этого мог бы иметь текстовый файл с одной записью на строку.
  2. Затем мы передаем массив в ForEach-Object который, как следует из названия, будет выполнять команды для каждого объекта в массиве. Если вместо этого вы используете текстовый файл в качестве списка, вам нужно извлечь его с помощью Get-Content а затем передать его в ForEach-Object вместо переменной.
  3. Сценарий в if предназначен для вашей охоты за вами.
  4. Get-Content делает то, что говорит на жестяной банке - получает содержимое материала.
  5. "\\10.0.$_\path\to\file.ini" - это цель, которую мы даем Get-Content . Оборачивая строку в двойные кавычки, мы сообщаем PowerShell, что мы хотим, чтобы она расширяла переменные в строке перед передачей параметра. $_ - это встроенная переменная, которая ссылается на текущий объект, над которым работают такие вещи, как ForEach-Object .
  6. Выходные данные из Get-Content передаются в Select-String . Select-String более или менее grep для PowerShell - на самом деле, я немного удивлен, что для него нет встроенного псевдонима, поскольку другие командлеты (так называемые команды PowerShell) имеют псевдонимы для подобных команд * nix, таких как Ls и Wget.
  7. "^\[CardSwipe\]" - О да. Select-String принимает RegEx, кстати.
  8. Команды переноса в круглых скобках позволяют напрямую получать свойства объектов, которые они генерируют, без необходимости сначала сбрасывать их в переменные или что-то еще. Итак, ( ... ).length означает, что я хочу получить длину любого объекта, выводимого из скрипта в скобках. Для строк это базовая длина символа. Для массивов это количество членов в массиве. Когда текстовый файл или подобный объект извлекается, он возвращается как "массив строк". Таким образом, значение свойства length объекта будет равно количеству строк в тексте.
  9. -ne оператор сравнения для "не равно". Если Select-String не находит совпадений, его вывод будет нулевым массивом с нулевой длиной. Все остальное будет иметь длину 1 или больше, поэтому мы запускаем if on -ne 0 .
  10. Write-Output - еще одна из тех, которые говорят сами за себя. Он пишет вывод. В этом случае мы говорим, что хотим вывести текущий объект, обрабатываемый ForEach-Object . Конечно, поскольку это внутри блока if , это произойдет только тогда, когда INI-файл соответствует заданным условиям. Вывод будет зависеть от того, какие "последние два октета" были обработаны, когда это произошло.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .