Take the 2-minute tour ×
Server Fault is a question and answer site for system and network administrators. It's 100% free, no registration required.

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'.
share|improve this question

3 Answers 3

up vote 1 down vote accepted

How about:

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

share|improve this answer
    
This works. Thanks Shay - and Bartek @bielawb on Twitter - who both managed to work out how to stop the $feed variable being detached from its .FullName property. –  Luke Puplett Dec 29 '10 at 12:10

This sort of thing can be worked around with the invoke-expression cmdlet

invoke-expression "import.exe `"C:\Some Path\With\Spaces.txt`""

The backticks will be interpreted and should start import.exe with the specified string.

share|improve this answer
    
I was too eager, this actually doesn't work. Still fighting. –  Luke Puplett Dec 29 '10 at 11:27

import.exe '"C:\Some Path\With\Spaces.txt"' does it for me :) nest the double quotes inside single quotes.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.