Beginner here, I am working on a error log file and library, the current step I am on is to pull specific information from a txt file.
The code I have currently is...
$StatusErr = "Type 1","Type 2"
for ($i=0; $i -lt $StatusErr.length; $i ) {
get-content C:\blah\Logs\StatusErrors.TXT |
select-string $StatusErr[$i] |
add-content C:\blah\Logs\StatusErrorsresult.txt
}
while it is working, I need it to display as
Type-1-Description
2-Description
Type-1-Description
2-Description
Type-1-Description
2-Description
etc.
it is currently displaying as
Type 1 = Type-1-Description
Type 1 = Type-1-Description
Type 1 = Type-1-Description
Type 2 = 2-Description
Type 2 = 2-Description
Type 2 = 2-Description
I am unsure how to change the arrangement and remove unneeded spaces and the = sign
CodePudding user response:
You need to search for both patterns in a single
Select-String
call in order to get matching lines in order.- While the
-Pattern
parameter does accept an array of patterns, in this case a single regex will do.
- While the
You need to use a regex pattern in order to capture and output only part of the lines that match.
$StatusErrRegex = '(?<=Type [12]\s*=\s*)[^ ] '
get-content C:\blah\Logs\StatusErrors.TXT |
select-string $StatusErrRegex |
foreach-object { $_.Matches.Value } |
set-content C:\blah\Logs\StatusErrorsresult.txt
Note that I've replaced add-content
with set-content
, as I'm assuming you don't want to append to a preexisting file. set-content
writes all objects it receives via the pipeline to the output file.
Select-String
outputs Microsoft.PowerShell.Commands.MatchInfo
instances whose .Matches
property provides access to the part of the line that was matched.
For an explanation of the regex and the ability to experiment with it, see this regex101.com page.
Additional notes:
Select-String
, like PowerShell in general, is case-insensitive by default; add the-CaseSensitive
switch, if needed.(?<=...)
is a (positive) lookbehind assertion, whose matching text doesn't became part of what the regex captures.\s*
matches zero or more whitespace characters;\s
would match one or more.[^ ]
matches one or more (^
spaces (=
sign.To match any of multiple words at the start of the pattern, use a regex alternation (
|
), e.g.'(?<=(type|data) [12]\s*=\s*)[^ ] '