Ищем подстановочную строку, затем записываем ее в вывод - PullRequest
0 голосов
/ 14 июня 2019

Я недавно начал свое путешествие в Powershell, и я написал код, который будет искать в группе документов слова ключевое слово (или фразу) и экспортировать имена документов в текстовый файл.Теперь мне было интересно, смогу ли я найти фразу, скажем, например: «wait * days», а затем вывести полную фразу «wait 10 days» в текстовый файл.Код, который у меня сейчас есть, кратко изложен следующим образом:

Буду признателен, если вы укажете мне правильное направление или покажете, с чего начать в плане написания этой программы.Спасибо!

Как вы можете видеть ниже, я написал почти весь код для поиска ключевого слова в документе.Все, что мне нужно, это указание относительно того, какая функция позволит мне записать фразу подстановки в текстовый файл.

$keyword = 'SOMETHING'
$source = 'C:\somepath'

$word = New-Object -ComObject Word.Application
$docs = Get-ChildItem -Path $source | Where-Object {$_.Name -like '*.doc*'}
{
    if ($word.Documents.Open($doc.FullName).Content.Find.Execute($keyword))
        {
        #Output Code
        }
    $word.Application.ActiveDocument.Close()
}

В настоящее время код может открывать и читать документы Microsoft Word и записывать документ в файл.выходной файл.Хотя я надеюсь записать результаты поиска по шаблону в вывод.Очевидно, переполнение стека не связано с получением кода, написанного для вас.Поэтому любое направление или даже сообщение мне, если это возможно в PowerShell, будет с благодарностью.

1 Ответ

0 голосов
/ 14 июня 2019

Единственный способ, которым я могу думать об этом, - это потянуть тело, а затем использовать -match, чтобы найти то, что вы ищете.

Есть свойство Find.MatchWildcards.Однако я не смог заставить его работать как положено. Find.MatchWildcards

Пример.Получить строку, начинающуюся с «wait» и заканчивающуюся «days»:

#looking for wait X days
#regex for wildcard
$keyword = '(wait).*(days)'
$source = 'C:\somepath'

$word = New-Object -ComObject Word.Application
$word.Visible = $False

$docs = Get-ChildItem -Path $source | Where-Object {$_.Name -like '*.doc*'}

$results = @{}
foreach($doc in $docs)
{    
    #open read only
    $document = $word.Documents.Open($doc.FullName,$false,$True)
    $body = $document.content
    #use Regex
    if($body.Text -match "$keyword")
    {
        #Example of action write to file each time there is a match
        $Matches[0] | out-file "C:\IndividualMatch.txt" -Append
        $properties = @{
            File = $doc.FullName
            Match = $keyword
            CompleteMatch = $Matches[0]
        }
        #store to results
        $results += $properties
    }
    $word.Application.ActiveDocument.Close()   

}
if($results)
{
    #if there are matches... do action -- output to text
    $results.CompleteMatch | Out-File "C:\test.txt"
}
else
{
    Write-Host "Cant find"
}
#clean up com object
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($word) | Out-Null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...