In a PowerShell script I'm trying to filter the output of the exiftool(-k).exe
command below, using Select-String
.
I've tried numerous permutations, but none work, and I always see the unfiltered output. What do I need to do to filter the output of this command?
Start-Process -FilePath "C:\PowerShell\exiftool(-k).exe" -ArgumentList test.jpg |
Select-String -pattern 'GPS' -SimpleMatch
The naming is inconvenient. Rename it to exiftool.exe and run it without start-process.
Or
The website recommends to 'rename to "exiftool.exe" for command-line use'. https://exiftool.org . Even in unix, it wouldn't work without escaping the parentheses.
There's also the option of using the call operator. Using tab completion actually does this:
You cannot directly receive output from a
Start-Process
call[1], so using it in a pipeline is pointless.Start-Process
runs in a different, new window, which is where you saw the unfiltered output (given that noSelect-String
was applied there); in your calling window,Start-Process
produced no output at all, and therefore nothing was sent toSelect-String
, and the pipeline as a whole produced no output.Never use
Start-Process
to synchronously invoke a console application whose output you want to capture or redirect - simply call the application directly:Note that
&
, the call operator, is needed for this invocation, because your executable path is (double-)quoted (of necessity here, because the file name contains(
and)
);&
is only needed for executable paths that are quoted and/or contain variable references; you wouldn't need it to callgit ...
, for instance.[1] While you would see the program's output in the caller's window if you added
-NoNewWindow -Wait
to aStart-Process
call, you still wouldn't be able to capture, pass on or redirect it.