'cd Program Files error: positional parameter cannot be found

PS C:\> cd Program Files

When I give this command, I don't know why, but it is not accepting Program Files. The same command is working perfectly fine in cmd.

This is the error it shows:

Set-Location : A positional parameter cannot be found that accepts argument 'Files'.
At line:1 char:1
+ cd Program Files
+ ~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Set-Location], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.SetLocationCommand


Solution 1:[1]

As stated in Maximilian Burszley's helpful answer, Program Files is parsed as two arguments, because spaces are used to separate command-line arguments.

Your attempt to use cd Program Files may be inspired by cmd.exe (the legacy Command Prompt), where this syntax indeed works; however, even there it conceptually violates the usual rules of argument parsing.

Therefore, you need to use a form of quoting in order to pass a value that contains spaces as a single argument.

You have several options to implement this quoting:

  • Use '...' around values that are literals, i.e., that should be used as-is.

  • Use "..." around values in which you want to embed variable references (e.g., $HOME) or subexpressions (e.g., $(Get-Date).

  • Use ` to quote (escape) a single character.

Therefore, you could use any of the following:

cd 'Program Files'
cd "Program Files"  # as there are no $-prefixed tokens, the same as 'Program Files'
cd Program` Files   # `-escape just the space char.

Also, you can use tab-completion to expand the (space-less) prefix of a space-containing path to its full form with quoting applied implicitly.

E.g., if you're in C:\ and you type:

cd Program<tab>

PowerShell automatically completes the command to:

 cd '.\Program Files\'

Note how the Program Files (along with .\ to refer to the current dir. and a trailing \ to indicate a dir.) was automatically single-quoted.

Solution 2:[2]

cd C:\Program` Files\ 

` just escape the space in folder name.

Solution 3:[3]

The reason is invalid syntax. Each argument to a powershell command is separated by space, so what you're actually doing is something similar to:

Set-Location -Path Program -Arg2 Files

But Set-Location (aliased: cd) does not have any positional arguments for a second position, so it can't bind it to any parameters and use it in the command, hence the terminating error.


If you want a simpler cd alias, you could do something like this (in your $profile):

function ChangeDirectory {
    param(
        [Parameter(
            Position = 0,
            Mandatory,
            ValueFromRemainingArguments
        )]
        [string[]] $Path
    )

    Set-Location -Path ($Path -join ' ')
}
Set-Alias -Name cd -Value ChangeDirectory

Do note, however, that if you're not specifying a relative path (.\), it will use the root path of your current drive (most likely, C:\). This can be tuned in the function to test for both locations (relative and drive-rooted), but logic for figuring out which one to use if they both exist would be tricky (or can always default to relative).

Solution 4:[4]

This is because of the space between the sentences. Enter code here You complete the tab. Replace PS F: > cd new folder with PS F: > cd "new folder" in the PowerShell. Or look at F: > cd './new folder'. I'm a beginner and you should try this.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2
Solution 3
Solution 4 Seneth_lakshan