Impossible d'avancer avec le cd

Sep 20 2020

J'ai un problème pour avancer sur un chemin avec PowerShell. Je suis capable de remonter le répertoire mais pas de descendre. Voici la situation:

J'ouvre PowerShell et tapez la commande "pwd" et cela montre que je suis actuellement dans PS C: \ Users \ Robert Inspiron14>

Je tape la commande "cd .." et maintenant je passe à PS C: \ Users>

J'essaye alors de changer de répertoire en tapant: "cd C: \ Users \ Robert Inspiron14" et je ne peux pas. Malheureusement, je ne peux pas encore publier de photo en raison d'un manque de réputation.

Je suis en mesure d'effectuer le changement dans CMD mais pas dans PowerShell. De plus, je ne sais pas comment changer l'utilisateur de "Robert Inspiron14" à simplement "Robert". Toute aide est appréciée!

Réponses

2 MathiasR.Jessen Sep 20 2020 at 21:21

Avant que PowerShell puisse exécuter votre cdcommande, il doit l' analyser , et l'analyseur de PowerShell interprète votre commande comme ceci:

cd  C:\Users\Robert Inspiron14
\/  \_____________/ \________/
Command Name  |            |
             argument 1    |
                         argument 2

En d'autres termes, C:\Users\Robertet Inspiron14sont interprétés comme des arguments séparés .

Aucun des deux arguments n'est un chemin vers un répertoire valide, donc cd(ou plutôt Set-Locationpour lequel cdest un alias) renvoie une erreur.

Vous pouvez forcer PowerShell à reconnaître C:\Users\Robert Inspiron14comme un seul argument de chaîne en se qualifiant ses limites en utilisant des guillemets ( à la fois "et 'travaillerez):

cd 'C:\Users\Robert Inspiron14'

Vous pouvez en savoir plus sur la façon dont PowerShell analyse les expressions de commande dans la about_Parsingrubrique d'aide

2 mklement0 Sep 20 2020 at 22:02

Pour compléter la réponse utile de Mathias R. Jessen avec plus d'informations générales:

Citer un argument qui contient des espaces est une nécessité syntaxique générale, dans tous les shells , car les espaces sans guillemets sont utilisés pour séparer plusieurs arguments .

Ce ne sont pas seulement les espaces qui nécessitent des guillemets, mais n'importe lequel des soi-disant métacaractères de PowerShell (caractères qui, lorsqu'ils sont utilisés sans guillemets, ont une fonction syntaxique ); par exemple, passer le chemin vers un répertoire nommé littéralement a;bnécessite également des guillemets, étant donné que cela ;serait autrement interprété comme un séparateur d'instructions .

Il existe plusieurs styles de devis :

  • Puisque votre chemin est un chemin littéral - il ne contient aucune référence ou expression de variable - '...'-quoting ( simple -quoting) est le meilleur choix.
    Utilisez "..."-quoting ( double -quoting) si votre chemin contient des variables ou des sous-expressions, c'est-à-dire si vous avez besoin d'une chaîne extensible (chaîne d'interpolation). [1]
    Consultez cette réponse pour une vue d'ensemble des littéraux de chaîne dans PowerShell.

  • Une autre solution, moins courante, consiste à échapper individuellement les caractères d'espace avec `le caractère d'échappement de PowerShell:cd C:\Users\Robert` Inspiron14

Notez également:

  • La complétion des onglets de PowerShell applique automatiquement les citations si nécessaire .

  • cd..est le nom d'une fonction intégrée dans PowerShell , dont le seul but est d'émuler cmd.exele comportement ( discutablement permissif) (voir ci-dessous); la fonction effectue un Set-Location ..appel syntaxiquement correct (vérifier en exécutant ${function:cd..}), avec un espace séparant le nom de la commande de son argument.


Contraste avec cmd.exe:

Malheureusement, cmd.exela cdcommande intégrée de a décidé de ne pas appliquer ses règles de syntaxe habituelles et a activé les appels tels que cd C:\Program Files.

Il n'aurait jamais dû faire cela : bien que pratique à première vue, il constitue une exception problématique aux règles habituelles qui invite à la confusion .
Notez que cmd.exela complétion par tabulation cite correctement les arguments qui contiennent des espaces.

De même, cd..a malheureusement été autorisé comme une alternative syntaxiquement exceptionnelle à la bonnecd .. - voir les commentaires sur cette réponse pour plus de détails.


[1] Remarque "..."-quoting n'est pas strictement nécessaire si vous utilisez des références de variable dans un chemin, tant que tous les composants littéraux ne nécessitent pas de guillemets; par exemple, $HOME\fooc'est bien sans citer, alors que les "alentours "$HOME\foo bar"sont obligatoires. Avec les sous-expressions ( $(...)), les règles deviennent plus compliquées , donc l'approche la plus simple est de toujours utiliser "..."-quoting avec elles.