No se puede avanzar con cd

Sep 20 2020

Tengo problemas para avanzar a través de un camino con PowerShell. Puedo moverme hacia arriba en el directorio pero no hacia abajo. Esta es la situación:

Abro PowerShell y escribo el comando "pwd" y muestra que actualmente estoy en PS C: \ Users \ Robert Inspiron14>

Escribo el comando "cd .." y ahora paso a PS C: \ Users>

Luego intento cambiar de directorio escribiendo: "cd C: \ Users \ Robert Inspiron14" y no puedo. Desafortunadamente, todavía no puedo publicar una foto por falta de reputación.

Puedo realizar el cambio en CMD pero no en PowerShell. Además, no sé cómo cambiar el usuario de "Robert Inspiron14" a solo "Robert". ¡Se agradece cualquier ayuda!

Respuestas

2 MathiasR.Jessen Sep 20 2020 at 21:21

Antes de que PowerShell pueda ejecutar su cdcomando, necesita analizarlo , y el analizador de PowerShell interpreta su comando de esta manera:

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

En otras palabras, C:\Users\Roberty Inspiron14se interpretan como argumentos separados .

Ninguno de los argumentos es una ruta a un directorio válido, por lo que cd(o más bien Set-Locationpara cuál cdes un alias) arroja un error.

Puede forzar a PowerShell a reconocer C:\Users\Robert Inspiron14como un argumento de cadena única calificando sus límites usando comillas (ambos "y 'funcionarán):

cd 'C:\Users\Robert Inspiron14'

Puede leer más sobre cómo PowerShell analiza las expresiones de comando en el about_Parsingtema de ayuda

2 mklement0 Sep 20 2020 at 22:02

Para complementar la útil respuesta de Mathias R. Jessen con más información básica:

Citar un argumento que contiene espacios es una necesidad sintáctica general, en todos los shells , porque los espacios sin comillas se utilizan para separar múltiples argumentos .

No son solo los espacios los que requieren comillas, sino cualquiera de los llamados metacaracteres de PowerShell (caracteres que, cuando se usan sin comillas, tienen función sintáctica ); por ejemplo, pasar la ruta a un directorio literalmente llamado también a;brequiere entre comillas, dado que de ;otro modo se interpretaría como un separador de instrucciones .

Hay varios estilos de citas :

  • Dado que su ruta es una ruta literal , no contiene referencias ni expresiones variables, las '...'comillas ( comillas simples ) son la mejor opción.
    Use "..."-quoting (comillas dobles ) si su ruta contiene variables o subexpresiones, es decir, si necesita una cadena expandible (cadena de interpolación). [1]
    Consulte esta respuesta para obtener una descripción general de los literales de cadena en PowerShell.

  • Otra solución menos común es escapar individualmente de los caracteres espaciales con el carácter `de escape de PowerShell:cd C:\Users\Robert` Inspiron14

También tenga en cuenta:

  • La finalización de la pestaña de PowerShell aplica automáticamente las cotizaciones según sea necesario .

  • cd..es el nombre de una función incorporada en PowerShell , cuyo único propósito es emular cmd.exeel comportamiento ( cuestionablemente permisivo) (ver más abajo); la función realiza una Set-Location ..llamada sintácticamente correcta (verificar ejecutando ${function:cd..}), con un espacio que separa el nombre del comando de su argumento.


Contraste con cmd.exe:

Desafortunadamente, cmd.exeel cdcomando incorporado decidió no hacer cumplir sus reglas de sintaxis habituales y habilitó llamadas como cd C:\Program Files.

Nunca debería haber hecho eso : si bien es conveniente a primera vista, constituye una excepción problemática de las reglas habituales que invita a la confusión .
Tenga en cuenta que cmd.exela función de tabulación cita correctamente los argumentos que contienen espacios.

De manera similar, cd..desafortunadamente se permitió como una alternativa sintácticamente excepcional a la correctacd .. ; consulte los comentarios sobre esta respuesta para obtener más detalles.


[1] Nota: las "..."comillas no son estrictamente necesarias si usa referencias de variables en una ruta, siempre que los componentes literales no requieran comillas; por ejemplo, $HOME\fooestá bien sin citar, mientras "que "$HOME\foo bar"se requieren los alrededores . Con subexpresiones ( $(...)), las reglas se vuelven más complicadas , por lo que el enfoque más simple es usar siempre"..." -comillas con ellas.