Reputation: 27360
I'm having an issue with powershell when invoking an exe at a path containing spaces.
PS C:\Windows Services> invoke-expression "C:\Windows Services\MyService.exe"
The term 'C:\Windows' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
It seems to be splitting on the space between 'Windows' and 'Services'. Any idea how to get around this problem?
Upvotes: 137
Views: 310157
Reputation: 65
So, my issue was similar. I wanted to play a Windows sound using Powershell, but the space in the "C:\Windows\Media\Windows Ding.wav" file created the exact same issue.
A lot of the answers talked about adding double quotes or invoke-expression or using different operators or creating a MySql dump, etc etc. But none of it worked for me. I messed around a little and this was my solution:
powershell -c (New-Object Media.SoundPlayer "'C:\Windows\Media\Windows Ding.wav'").PlaySync();
Double quotes on the outside, and single quotes on the inside.
I hope that many years in the future this helps someone who is still struggling despite the many similar answers already posted.
Upvotes: 0
Reputation: 1
my fix-around the block of spaces especially folder naming was to go back to folder and change the 'space' with a dot. ie. Maine Cabin Masters to Maine.Cabin.Masters This works with conventional code either PS or Terminal mode.
Upvotes: 0
Reputation: 23830
Due to several PowerShell quoting rules that are used for passing arguments to native commands which also have specific experimental Features in PowerShell, quoting might get very confusing. Therefore the solution in some cases might be simply to don't go down the rabbit hole:
$FSO = New-Object -ComObject Scripting.FileSystemObject
$FSO.getfile('C:\Windows Services\MyService.exe').ShortPath
C:\WINDOW~1\MYSERV~1.EXE
Upvotes: 0
Reputation: 109
What worked for me (I needed the path to create a MySQL dump), was to place the directory in between 6 double quotes like so:
$path = """C:\Path\To\File"""
Upvotes: 10
Reputation: 665
C:
cd {press tab}
Upvotes: -2
Reputation: 2420
Simply put the path in double quotes in front of cd, Like this:
cd "C:\Users\MyComputer\Documents\Visual Studio 2019\Projects"
Upvotes: -2
Reputation: 6615
Would this do what you want?:
& "C:\Windows Services\MyService.exe"
Use &
, the call operator, to invoke commands whose names or paths are stored in quoted strings and/or are referenced via variables, as in the accepted answer. Invoke-Expression
is not only the wrong tool to use in this particular case, it should generally be avoided.
Upvotes: 198
Reputation: 19
Try this, simple and without much change:
invoke-expression "'C:\Windows Services\MyService.exe'"
using single quotations at the beginning and end of the path.
Upvotes: 1
Reputation: 65
Just put ${yourpathtofile/folder}
PowerShell does not count spaces; to tell PowerShell to consider the whole path including spaces, add your path in between ${
& }
.
Upvotes: -1
Reputation: 2519
Can use the .
dot operator.
. "C:\Users\user\AppData\Local\Programs\Microsoft VS Code\bin\code.cmd"
or the Start-Process
command
Start-Process -PSPath "C:\Users\user\AppData\Local\Programs\Microsoft VS Code\bin\code.cmd"
or using ProcessStartInfo
and Process
$ProcessInfo = New-Object -TypeName System.Diagnostics.ProcessStartInfo
$ProcessInfo.FileName = 'C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe'
if($Admin){ $ProcessInfo.Verb = 'runas' }
$ProcessInfo.UseShellExecute = $false
$CommandParameters = '-noexit -noprofile -command Set-Location -LiteralPath c:\; $host.ui.RawUI.WindowTitle = ''[{0}] PS''; Set-PSReadlineOption -HistorySaveStyle SaveNothing;' -f $Cred.UserName
$ProcessInfo.Arguments = $CommandParameters
$ProcessInfo.Domain = ($Cred.UserName -split '\\')[0]
$ProcessInfo.UserName = ($Cred.UserName -split '\\')[1]
$ProcessInfo.Password = $Cred.Password
$ProcessObject = New-Object -TypeName System.Diagnostics.Process
$ProcessObject.StartInfo = $ProcessInfo
$ProcessObject.Start() | Out-Null
Upvotes: 7
Reputation: 101
This worked for me:
$scanresults = Invoke-Expression "& 'C:\Program Files (x86)\Nmap\nmap.exe' -vv -sn 192.168.1.1-150 --open"
Upvotes: 9
Reputation: 21
Please use this simple one liner:
Invoke-Expression "C:\'Program Files (x86)\Microsoft Office\root\Office16'\EXCEL.EXE"
Upvotes: 2
Reputation: 1159
For any file path with space, simply put them in double quotations will work in Windows Powershell. For example, if you want to go to Program Files directory, instead of use
PS C:\> cd Program Files
which will induce error, simply use the following will solve the problem:
PS C:\> cd "Program Files"
Upvotes: 11
Reputation: 10798
Using Powershell on Windows10 in 2018, what worked for me was simply to replace double quotes "
by simple quotes '
. Adding the backtick before the space, as suggested in an answer, broke the path.
Upvotes: 7
Reputation: 505
Not sure if someone still needs it... I needed to invoke msbuild in powershell and following worked fine:
$MSBuild = "${Env:ProgramFiles(x86)}\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\MSBuild.exe"
& $MSBuild $PathToSolution /p:OutDir=$OutDirVar /t:Rebuild /p:Configuration=Release
Upvotes: 15
Reputation: 179
"&'C:\Windows Services\MyService.exe'" | Invoke-Expression
via https://www.vistax64.com/powershell/52905-invoke-expression-exe-has-spaces-its-path.html
Upvotes: 13
Reputation: 7506
There's a hack I've used since the Invoke-Expression works fine for me.
You could set the current location to the path with spaces, invoke the expression, get back to your previous location and continue:
$currLocation = Get-Location
Set-Location = "C:\Windows Services\"
Invoke-Expression ".\MyService.exe"
Set-Location $currLocation
This will only work if the exe doesn't have any spaces in its name.
Hope this helps
Upvotes: 3
Reputation: 26031
You can escape the space by using single quotations and a backtick before the space:
$path = 'C:\Windows Services\MyService.exe'
$path -replace ' ', '` '
invoke-expression $path
Upvotes: 39