2016-06-30 4 views
1

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

Как я могу внести изменения в «действия на матче» сделать этот скрипт (WinSCP Extension Search recursively for text in remote directory/Grep files over SFTP/FTP protocol) работать тихо (без отображения ничего в терминале) и после того, как найдено совпадение просто остановиться и отображать только имя папки (содержащий файл с текстовой строкой)? Также можно отобразить результат в красном? Вот «Действие по совпадению» часть скрипта (я попытался включить все это, но по какой-то причине не могу это сделать).

Я могу сделать это с помощью новейшего пользовательского интерфейса WinSCP Поиск текста button (см. Ниже скрипт .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 
    } 
} 

ответ

0
{ 
    # Action on match 

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

    $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 
    { 
     # Use -Pattern instead of -SimpleMatch for regex search 
     $matchInfo = Select-String -Path $tempPath -SimpleMatch $text 
     Remove-Item $tempPath 

     if ($matchInfo) 
     { 
      # Print a path to the file's folder and exit 
      Write-Host ($fileInfo.FullName -replace "/[^/]*$") 
      exit 
     } 
    } 
} 
+0

Спасибо тааак много Martin для супер быстрой реакции, это то, что я искал! Я сделал некоторые небольшие корректировки, и он работает отлично. Вы знаете способ автоматизации задачи, то есть я могу легко запустить WinSCP в сеанс с помощью пакета, но я прошел через десятки страниц форума WinSCP и не могу понять, как автоматизировать кнопку «Поиск текста» (другими словами , пользователь нажимает на пакет на своем рабочем столе и запускает WinSCP, а затем появляется окно поиска текста). Конечно, это немного роскоши. Еще раз спасибо вам за вашу помощь. –

+0

Теперь я заметил, что каждый раз, когда я делаю поиск, терминал дважды перечисляет имя папки по какой-то причине .. хотя я знаю, что есть только одна такая папка. Ну, ничего страшного, я думаю. –

+0

В последнем WinSCP 5.8.4, если вы удерживаете клавиши Ctrl и Shift при нажатии кнопки «ОК» в диалоговом окне параметров команды, команда для запуска поиска копируется в буфер обмена. Просто вставьте команду в пакетный файл. Кроме того, перед этим нужно вызвать 'set WINSCP_PATH = c: \ program files (x86) \ winscp \ winscp.exe'. –