30

I'm trying to get this simple PowerShell script working, but I think something is fundamentally wrong. ;-)

ls | ForEach { "C:\Working\tools\custom-tool.exe" $_ }

I basically want to get files in a directory, and pass them one by one as arguments to the custom tool.

4 Answers 4

46

If you still need quotes around the command path (say, if you've got spaces), just do it like this:

ls | % { &"C:\Working\tools\custom-tool.exe" $_.FullName }

Notice the use of & before the string to force PowerShell to interpret it as a command and not a string.

Sign up to request clarification or add additional context in comments.

2 Comments

And if flags are needed, they can be added after the end; ls | % { &"C:\Working\tools\custom-tool.exe" $_.FullName --flag --flag2=47}
I found out. It's an alias for ForEach-Object. You can see current aliases at the powershell prompt by typing get-alias
37
ls | %{C:\Working\tools\custom-tool.exe $_}

As each object comes down the pipeline the tool will be run against it. Putting quotes around the command string causes it to be... a string! The local variable "$_" it then likely doesn't know what to do with so pukes with an error.

Comments

6

I'm betting your tool needs the full path. The $_ is each file object that comes through the pipeline. You likely need to use an expression like this:

ls | %{C:\Working\tools\custom-tool.exe $_.fullname}

Comments

3

Both Jeffrery Hicks and slipsec are correct. Yank the double quotes off.

$_ or $_.fullname worked in my test script (below). YMMV with your custom-tool.

gci | % { c:\windows\notepad.exe $_.fullname }

or

gci | % { c:\windows\notepad.exe $_ }

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.