Я хочу иметь возможность искать текстовую строку во всех папках на удаленном 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
}
}