141

I'm having an issue with PowerShell when invoking an exe at a path containing spaces.

cd C:\Windows Services
invoke-expression "C:\Windows Services\MyService.exe"`

Output:

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'. How can I get around this problem?

1
  • 2
    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. Commented Aug 10, 2019 at 16:36

18 Answers 18

203

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.

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

1 Comment

For me, I am passing the path as an -ArgumentList into Start-Process. Start-Process -FilePath "notepad++.exe" -ArgumentList "C:\Long Path\That\contains\many spaces\toThisFile.txt"
39

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

3 Comments

Problem with this solution is that the path is passed in as an argument and I cannot control how it is escaped.
You can just perform -replace on the variable containing the path and replace ' ' with '` '
While this answers the question as asked, it's worth pointing out that Invoke-Expression is not only the wrong tool to use for the OP's use case, it should generally be avoided.
15

I needed to invoke msbuild in PowerShell and the 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

Comments

13
"&'C:\Windows Services\MyService.exe'" | Invoke-Expression

via https://www.vistax64.com/powershell/52905-invoke-expression-exe-has-spaces-its-path.html

Comments

11

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 using

C:
cd \
cd Program Files

which will induce an error, simply use the following. It will solve the problem:

C:
cd \
cd "Program Files"

1 Comment

Doesn't work for me. Using PowerShell v7.3.0
10

This worked for me:

$scanresults = Invoke-Expression "& 'C:\Program Files (x86)\Nmap\nmap.exe' -vv -sn 192.168.1.1-150 --open"

1 Comment

Thank you very much! This worked to launch a powershell file named wslLauncher.ps1 that was located in a path that contained a space, from Eclipse in Java. The exact line of code was: String command = "powershell.exe & '"+launcherPath+launcherName+"' ";
10

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"""

Comments

7

Using PowerShell on Windows 10 in 2018, simply replacing double quotes " by simple quotes ' worked for me.

Adding the backtick before the space, as suggested in an answer, broke the path.

1 Comment

Works for me. If I use double quote, I get the error ParameterArgumentValidationError.
7

You 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

Comments

3

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 file doesn't have any spaces in its name.

Comments

2

Please use this simple one liner:

Invoke-Expression "C:\'Program Files (x86)\Microsoft Office\root\Office16'\EXCEL.EXE"

Comments

1

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.

1 Comment

This worked for me when I needed to invoke a powershell script from bash and double quotes or triple double quotes weren't cutting it.
0

My fix: Around the block of spaces, especially folder naming, go back to the folder and change the 'space' to a dot. For example, "Maine Cabin Masters" to "Maine.Cabin.Masters".

This works with conventional code, either PowerShell or Terminal mode.

Comments

0

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:

Avoid quoting file paths with spaces by using the 8.3 filenames

$FSO = New-Object -ComObject Scripting.FileSystemObject
$FSO.getfile('C:\Windows Services\MyService.exe').ShortPath
C:\WINDOW~1\MYSERV~1.EXE

Comments

0

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, Invoke-Expression, using different operators, creating a MySQL dump, 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.

Comments

-1

Just put ${yourpathtofile/folder}

PowerShell does not count spaces; to tell PowerShell to consider the whole path including spaces, add your path in between ${ & }.

Comments

-2

Simply put the path in double quotes in front of cd, Like this:

cd "C:\Users\MyComputer\Documents\Visual Studio 2019\Projects"

Comments

-2
  1. enter the root C drive by entering command

C:

  1. type cd and then press Tab key, it will toggle through all available locations and press enter when you have reached the desired one

cd {press tab}

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.