Вы не говорите, какие у вас проблемы.Вы не показываете ошибки и не объясняете свою проблему с вашим кодом.
Если вы пытаетесь сделать это для чего-либо, кроме текстовых файлов, это никогда не сработает.
Почему вы вообще вызываете 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