Как переделать скрипт WinSCP для рекурсивного поиска текста, чтобы распечатать только папку первого совпадения и выйти

Я хочу иметь возможность искать текстовую строку во всех папках на удаленном FTP-сервере. После обнаружения мне нужно знать имя папки, содержащей текстовый документ, НО не имя файла.

Как внести изменения в "Действие при совпадении", чтобы создать этот скрипт (WinSCP Расширение Рекурсивный поиск текста в удаленном каталоге / файлах Grep по протоколу SFTP/FTP) выполняется без вывода сообщений (без отображения чего-либо в терминале), и как только совпадение будет найдено, просто остановитесь и отобразите ТОЛЬКО имя папки (содержащей файл с текстовой строкой)? Также возможно ли отображать результат красным цветом? Вот часть скрипта "Действие при совпадении" (я пытался включить все это, но по какой-то причине не могу).

Я могу сделать это с помощью последней пользовательской кнопки WinSCP Search for Text (пожалуйста, см. скрипт .ps1 ниже, который делает эту функцию поиска возможной). Однако вместо того, чтобы просто останавливаться на совпадении, поиск продолжается до последней папки. Хуже всего то, что для того, чтобы найти результат, мне нужно прокрутить страницу до конца и проверить каждую запись. Только у одного из них будет указано имя моей папки, так что это долгая процедура.

{
    # Action on match

    # Modify the code below if you want to do another task with
    # matching files, instead of grepping their contents

    Write-Host ("File {0} matches mask, searching contents..." -f $fileInfo.FullName)
    $tempPath = (Join-Path $env:temp $fileInfo.Name)
    # Download file to temporary directory
    $sourcePath = [WinSCP.RemotePath]::EscapeFileMask($fileInfo.FullName) 
    $transferResult = $session.GetFiles($sourcePath, $tempPath)
    # Did the download succeeded?
    if (!$transferResult.IsSuccess)
    {
        # Print error (but continue with other files)
        Write-Host $transferResult.Failures[0].Message
    }
    else
    {
        # Search and print lines containing "text".
        # Use -Pattern instead of -SimpleMatch for regex search
        $matchInfo = Select-String -Path $tempPath -SimpleMatch $text
        # Print the results
        foreach ($match in $matchInfo)
        {
            Write-Host ($fileInfo.FullName + ":" + $match.LineNumber + ":" + $match.Line)
        }
        # Delete temporary local copy
        Remove-Item $tempPath
    }
}

person Angel Eyes    schedule 30.06.2016    source источник


Ответы (1)


person    schedule
comment
Большое спасибо Мартин за ваш супер быстрый ответ, это то, что я искал! Я внес небольшие коррективы, и он работает отлично. Знаете ли вы способ автоматизации этой задачи, т. е. я могу легко запустить WinSCP в сеансе с пакетом, но я просмотрел десятки страниц форума WinSCP и не могу понять, как автоматизировать кнопку «Поиск текста» (другими словами , пользователь щелкает пакет на своем рабочем столе, и WinSCP запускается, а затем открывается окно «Поиск текста»). Это немного роскоши, конечно.. Еще раз большое спасибо за вашу помощь. - person Angel Eyes; 01.07.2016
comment
Только сейчас заметил, что каждый раз, когда я выполняю поиск, терминал по какой-то причине дважды отображает имя папки ... хотя я точно знаю, что такая папка только одна. Ну, думаю, ничего страшного. - person Angel Eyes; 01.07.2016
comment
В последней версии WinSCP 5.8.4, если вы удерживаете клавиши Ctrl и Shift, нажимая OK в диалоговом окне параметров команды, команда для запуска поиска копируется в буфер обмена. Просто вставьте команду в пакетный файл. Кроме того, вам нужно позвонить set WINSCP_PATH=c:\program files (x86)\winscp\winscp.exe перед этим. - person Martin Prikryl; 01.07.2016
comment
Здравствуйте, Мартин, спасибо за ваше предложение, но я пробовал уже пару дней, и мне не повезло. Когда я копирую команду в буфер обмена, я получаю следующее: powershell.exe -ExecutionPolicy Bypass -File C:\Program Files (x86)\WinSCP\Extensions\SearchText.WinSCPextension.ps1 -sessionUr l ingest:[email protected] -path /content/ -text -wildcard * .xml -pause -sessionLogPath . Затем я делаю пакет с этой командой и получаю следующую ошибку: - person Angel Eyes; 03.07.2016
comment
Ошибка: параметр исключения. Путь: не удается найти путь «C:\Program Files (x86)\WinSC P\Extensions\WinSCPnet.dll», поскольку он не существует. - person Angel Eyes; 03.07.2016
comment
Если я запускаю тот же пакет с заданной вами строкой WINSCP_PATH, я получаю сообщение об ошибке: x86: термин «x86» не распознается как имя командлета, функции, файла сценария или работающей программы. Проверьте правильность написания имени или, если был указан путь, убедитесь, что путь указан правильно, и повторите попытку. В строке: 1 символ: 48, -ExtensionPolicy Bypass -File C:\Porgram File. Вы знаете, что я делаю неправильно? - person Angel Eyes; 03.07.2016
comment
Да, только что сделал еще несколько тестов и точно так же - по какой-то причине команда powershell.exe пакета ищет \winscp\winscp.exe\WinSCPnet.dll, которого, конечно, не существует. - person Angel Eyes; 04.07.2016
comment
Хорошо, это должно было быть set WINSCP_PATH=c:\program files (x86)\winscp - person Martin Prikryl; 04.07.2016
comment
Да, пробовал и многие другие комбинации. Может это из-за того, что я на Севере 2008 R2. Вот что я получаю C:\Users\Administrator\Desktop›set WINSCP_PATH=c:\program files (x86)\winscp C:\Users\Administrator\Desktop›powershell.exe -ExecutionPolicy Bypass -File C:\Program Files ( x86)\WinSCP\Extensions\SearchText.WinSCPextension.ps1 -sessionUr l ingest:[email protected] -path /content/ -text -wildcard * .* -pause -sessionLogPath Ошибка: невозможно связать аргумент с параметром «Шаблон», поскольку это пустая строка. Нажмите любую клавишу для выхода... - person Angel Eyes; 05.07.2016
comment
Другими словами, он выполняет терминальный поиск, что нормально, но тогда вам нужно отредактировать пакет и ввести строку между расширением . Я думал, что это должно было запустить графический интерфейс winscp и активировать кнопку «Поиск текста». - person Angel Eyes; 05.07.2016
comment
Просто удалите -text "" из командной строки, чтобы PowerShell запросила у вас значение при запуске. - person Martin Prikryl; 05.07.2016
comment
Сначала совершенно неправильно вас понял, и поэтому я ходил кругами. Получил, теперь все работает отлично. Большое спасибо за всю вашу помощь, я бы ничего не добился без нее и замечательного инструмента, который вы создали! - person Angel Eyes; 05.07.2016
comment
Извините, я новичок в этом, как вы это делаете? Я не могу найти кнопку. - person Angel Eyes; 05.07.2016
comment
Да, нажал на это, и он стал зеленым - я думаю, это все? - person Angel Eyes; 06.07.2016