Powershell – Pass quoted argument string to Start-Process in PowerShell

powershell

I'm trying to very simply run an executable and pass a file path in as the first argument. In DOS, this would be the command:

import.exe "C:\Some Path\With\Spaces.txt"

By placing the path in quotes, the path is correctly parsed as the first token into the executable.

In PowerShell I'm using this:

$feeds = dir 'T:\Documents\Company\Product Development\Data
foreach ($feed in $feeds) { start -FilePath import.exe -ArgumentList $feed.FullName }

The problem with the Start-Process cmdlet in PowerShell is that it uses a string array for arguments, so the path is broken up and sent to the executable as separate tokens, or effectively as a string without those important quotes.

Adding quotes to my PowerShell command line force "$feed.FullName" to be treated literally.

And double quotes "" make PowerShell not see anything in the argument list. "The argument is null or empty." it tells me.

I expect that this is a known headache and has had a known workaround from day one.

Thanks

Luke

UPDATES AND RESPONSES

foreach ($feed in $feeds) { Invoke-Expression "start import.exe `"$feed.FullName`"" }

Note: I'm using Start since despite setting my location to the folder in which import.exe resides, PowerShell seems to have been written to look for executables in the file-system current location.

The variable gets interpreted with the .FullName as a literal string!:

filename.txt.FullName

This one:

foreach ($feed in $feeds) { Invoke-Expression "C:\Users\Public\Documents\~Main\Data.Importer\Data.Importer\bin\Release\import.exe ($feed.FullName)" }

Results in:

Invoke-Expression : Unexpected token '_data.txt.FullName' in expression or statement.

Interestingly, on its own, this works:

C:\Users\Public\Documents\~Main\Data.Importer\Data.Importer\bin\Release\import.exe $feed.FullName

But this:

foreach ($feed in $feeds) { Invoke-Expression C:\Users\Public\Documents\~Main\Vuplan\Evoq.Vuplan.Data.Epg.Importer\Evoq.Vuplan.Data.Epg.Importer\bin\Release\import.exe $feed.FullName }

Results in this:

Invoke-Expression : A positional parameter cannot be found that accepts argument 'T:\Documents\Company\Product Development\Data\3112_data.txt'.

Best Answer

How about:

Invoke-Expression "start import.exe '$($feed.FullName)'"