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'.
This command works for me:
Make sure you nest the double quotes inside single quotes.
How about:
After assigning all paths to variables, the
Start-Process
command can be used like this:Start-Process -NoNewWindow -FilePath $toolPath -ArgumentList `"$arg1`",`"$arg2`"
By using `" the arguments get passed quoted to the application, i.e.: Screenshot of an example
This sort of thing can be worked around with the
invoke-expression
cmdletThe backticks will be interpreted and should start import.exe with the specified string.
Calling DOS commands in Powershell directly.
For example: