Возвращение сопоставленного регулярного выражения и свойств объекта выбора файла, в котором сопоставлено выражение - PullRequest
1 голос
/ 12 мая 2019

Я пытаюсь сопоставить регулярное выражение и вернуть как совпадающее выражение, так и свойства объекта файла, где регулярное выражение истинно.

$pattern1 = regex1

$pattern2 = regex2

Get-ChildItem -Recurse -file -force -path "C:\" | ?{ findstr.exe /mprc:. $_.FullName } | where { $_ | Select-String -pattern $pattern1, $pattern2}  | Select-Object -Property FullName, CreationTime, LastWriteTime, Matched regex $pattern* | export-csv -Path c:\temp\Found.csv -NoTypeInformation

Я могу подобраться, используя:

Get-ChildItem -Path $path -Recurse -Force -Exclude *.*db, *.jpg, *.xps, *.msg, *.bmp, *.xfdl, *.ppt, *.dll, *.rs, *.evtx, *.dat.LOG1, *.dat.LOG2, *.log, *.dat, *.jfm, *.lock, *.pem -ErrorAction $erroractionpref | Select-String -pattern $pattern3, $pattern4 | Select-Object Path, FullName, Extension, BaseName, LineNumber, line, LastWriteTime

Однако мне не удалось вывести строку, с которой сопоставлено регулярное выражение, а также свойства объекта файла.

Пример выходных данных: FullName, CreationTime, LastWriteTime, MatchedRegex $ Pattern, Extension, BaseName

1 Ответ

1 голос
/ 13 мая 2019

Вы не говорите, какие у вас проблемы.Вы не показываете ошибки и не объясняете свою проблему с вашим кодом.

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

Почему вы вообще вызываете exe, когда вы можете просто использовать Select-String в обоих случаях?
Почему вы смешиваете псевдонимы?

Каково ожидание этого ...

Matched regex $pattern* 

... Select-Object никогда не узнает, что это такое, и поэтому потерпит неудачу.Вы должны использовать допустимые свойства (или вычисляемые свойства) в Select.

Запуск вашего кода, слегка измененный, возвращает результаты для указанных шаблонов регулярных выражений.

Findstr details

# /m Prints only the file name if a file contains a match. 
# /p Skips files with non-printable characters. 
# /r Processes search strings as regular expressions. This is the default setting. 
# /c:<String> Uses the specified text as a literal search string.
$pattern1 = 'localhost'
$pattern2 = 'COMPUTERNAME'

Get-ChildItem -Recurse -file -force -path "E:\Temp" | 
Where-Object { findstr.exe /mprc:. $PSItem.FullName } | 
where-Object { $PSItem | Select-String -pattern $pattern1, $pattern2 }  | 
Select-Object -Property FullName, CreationTime, LastWriteTime

# Results

FullName                                       CreationTime          LastWriteTime        
--------                                       ------------          -------------        
E:\Temp\available13.html.2019-03-26_081523.bak 4/1/2019 9:22:45 AM   3/27/2019 11:37:33 PM
E:\Temp\hostlist.txt                           3/27/2019 11:36:53 PM 3/27/2019 11:37:33 PM
E:\Temp\index.html.2019-03-26_081538.bak       4/1/2019 9:22:49 AM   3/27/2019 11:37:33 PM
E:\Temp\Servers.txt                            5/8/2019 2:52:29 PM   5/10/2019 3:52:20 PM 

Оставив последний бит ...

Matched regex $pattern* 

даст вам это ...

$Error | Format-List -Force


Exception             : System.Management.Automation.RuntimeException: The variable '$pattern' cannot be retrieved because it has not been set.
                           at System.Management.Automation.VariableOps.GetVariableValue(VariablePath variablePath, ExecutionContext 
                        executionContext, VariableExpressionAst varAst)
                           at System.Management.Automation.Interpreter.FuncCallInstruction`4.Run(InterpretedFrame frame)
                           at System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame)
TargetObject          : pattern
CategoryInfo          : InvalidOperation: (pattern:String) [], RuntimeException
FullyQualifiedErrorId : VariableIsUndefined
ErrorDetails          : 
InvocationInfo        : System.Management.Automation.InvocationInfo
ScriptStackTrace      : at <ScriptBlock>, <No file>: line 4
PipelineIterationInfo : {}
PSMessageDetails      : 

Обновление для последующей операции OP

# Change the select to all possible properties ...

$pattern1 = 'localhost'
$pattern2 = 'COMPUTERNAME'

Get-ChildItem -Recurse -file -force -path "E:\Temp" | 
Where-Object { findstr.exe /mprc:. $PSItem.FullName } | 
where-Object { $PSItem | Select-String -pattern $pattern1, $pattern2 }  | 
Select-Object -Property *

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

Вы также должны принять во внимание, что сопоставление с образцом может быть одним или несколькими шаблонами, которые вы передаете, поэтому при этом это не одна запись в строке, а массив.Итак, теперь вам нужно решить, как вы хотите, чтобы этот вывод выглядел, когда все шаблоны совпали.

Например, изменение кода для обработки этого шаблона дает вывод ...

(Теперь, это просто быстрый клочок, не изящный.)

$pattern1 = 'localhost'
$pattern2 = 'COMPUTERNAME'

Get-ChildItem -Recurse -file -force -path "E:\Temp" | 
Where-Object { findstr.exe /mprc:. $PSItem.FullName } | 
where-Object { $PatternMatch = (Select-String -pattern $pattern1, $pattern2 -Path $PSItem.FullName )
Select-String -pattern $pattern1, $pattern2 -Path $PSItem.FullName 
}  | 
Select-Object -Property FullName, CreationTime, LastWriteTime, 
@{Name = 'PatternMatch';Expression = {$PatternMatch.Pattern}}

# Results

FullName                                       CreationTime          LastWriteTime         PatternMatch             
--------                                       ------------          -------------         ------------             
E:\Temp\available13.html.2019-03-26_081523.bak 4/1/2019 9:22:45 AM   3/27/2019 11:37:33 PM {COMPUTERNAME, localhost}
E:\Temp\hostlist.txt                           3/27/2019 11:36:53 PM 3/27/2019 11:37:33 PM {COMPUTERNAME, localhost}
E:\Temp\index.html.2019-03-26_081538.bak       4/1/2019 9:22:49 AM   3/27/2019 11:37:33 PM {COMPUTERNAME, localhost}
E:\Temp\Servers.txt                            5/8/2019 2:52:29 PM   5/10/2019 3:52:20 PM  localhost 

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

Если вы смотрите на совпадение 1: 1, то есть отображение файла несколько раз за совпадение,тогда вам в конечном итоге понадобится явная попытка цикла.

Например:

$pattern1 = 'localhost'
$pattern2 = 'COMPUTERNAME'

Get-ChildItem -Recurse -file -force -path "E:\Temp" | 
Where-Object { findstr.exe /mprc:. $PSItem.FullName } | 
ForEach { 
    Select-String -pattern $pattern1, $pattern2 -Path $PSItem.FullName | 
    Select-Object -Property Path, Pattern, 
    @{Name = 'CreationDate';Expression = {(Get-ChildItem -Path $PSItem.Path).CreationTime}},
    @{Name = 'LastWriteTime';Expression = {(Get-ChildItem -Path $PSItem.Path).LastWriteTime}}
} 


# Results

Path                                           Pattern      CreationDate          LastWriteTime        
----                                           -------      ------------          -------------        
E:\Temp\available13.html.2019-03-26_081523.bak COMPUTERNAME 4/1/2019 9:22:45 AM   3/27/2019 11:37:33 PM
E:\Temp\available13.html.2019-03-26_081523.bak localhost    4/1/2019 9:22:45 AM   3/27/2019 11:37:33 PM
E:\Temp\hostlist.txt                           COMPUTERNAME 3/27/2019 11:36:53 PM 3/27/2019 11:37:33 PM
E:\Temp\hostlist.txt                           localhost    3/27/2019 11:36:53 PM 3/27/2019 11:37:33 PM
E:\Temp\index.html.2019-03-26_081538.bak       COMPUTERNAME 4/1/2019 9:22:49 AM   3/27/2019 11:37:33 PM
E:\Temp\index.html.2019-03-26_081538.bak       localhost    4/1/2019 9:22:49 AM   3/27/2019 11:37:33 PM
E:\Temp\Servers.txt                            localhost    5/8/2019 2:52:29 PM   5/10/2019 3:52:20 PM 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...