Невозможно двигаться вперед с помощью компакт-диска

У меня возникла проблема с продвижением по пути с помощью PowerShell. Я могу двигаться вверх по каталогу, но не вниз. Вот ситуация:

Я открываю PowerShell и ввожу команду pwd, и она показывает, что я сейчас нахожусь в PS C:\Users\Robert Inspiron14›.

Я набираю команду cd.. и теперь я перехожу к PS C:\Users›

Затем я пытаюсь изменить каталоги, набрав: cd C:\Users\Robert Inspiron14, но не могу. К сожалению, пока не могу выложить фото из-за отсутствия репутации.

Я могу внести изменения в CMD, но не в PowerShell. Кроме того, я не знаю, как изменить пользователя с Robert Inspiron14 на просто Robert. Любая помощь приветствуется!


person Robert    schedule 20.09.2020    source источник
comment
Изменить cd C:\Users\Robert Inspiron14 на cd 'C:\Users\Robert Inspiron14'   -  person Mathias R. Jessen    schedule 20.09.2020
comment
Позвольте мне дать вам стандартный совет новичкам в следующем комментарии (вы должны принять ответ Матиаса).   -  person mklement0    schedule 21.09.2020
comment
Если вы примете ответ, вы поможете будущим читателям, показав им, что решило вашу проблему. Чтобы принять ответ, нажмите на большой символ ✓ под большим числом слева от ответа (вы получите 2 очка репутации). Если у вас есть не менее 15 очков репутации, вы также можете проголосовать за другие полезные ответы (при желании также за принятый). Если ваша проблема еще не решена, отправьте отзыв или, если вы нашли решение самостоятельно, ответьте сами себе.   -  person mklement0    schedule 21.09.2020


Ответы (2)


Прежде чем PowerShell сможет выполнить вашу команду cd, ему необходимо разобрать ее, и синтаксический анализатор PowerShell интерпретирует вашу команду следующим образом:

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

Другими словами, C:\Users\Robert и Inspiron14 интерпретируются как отдельные аргументы.

Ни один из аргументов не является путем к действительному каталогу, поэтому cd (или, скорее, Set-Location, для которого cd является псевдонимом) выдает ошибку.

Вы можете заставить PowerShell распознавать C:\Users\Robert Inspiron14 как один строковый аргумент, указав его границы с помощью кавычек (будут работать как ", так и '):

cd 'C:\Users\Robert Inspiron14'

Подробнее о том, как PowerShell анализирует выражения команд, можно прочитать в статье about_Parsing тема справки

person Mathias R. Jessen    schedule 20.09.2020
comment
Удивительно. После того, как вы объяснили это, я также понял, что могу использовать ` для обозначения пробела. - person Robert; 21.09.2020
comment
Это тоже сработает - он ускользает от пробела, сообщая синтаксическому анализатору PowerShell, что следующий не обрабатывается так, как вы обычно это делаете. - person Mathias R. Jessen; 21.09.2020
comment
Красиво сделано; придирка: хотя ни один из аргументов не является допустимым путем к каталогу, причина возникновения ошибки заключается в том, что Set-Location принимает только один аргумент позиционно, и возникающая в результате синтаксическая ошибка < i>предвосхищает любую проверку существования C:\Users\Robert. - person mklement0; 21.09.2020

Чтобы дополнить полезный ответ Матиаса Р. Джессена дополнительной справочной информацией:

Заключение в кавычки аргумента, содержащего пробелы, является общей синтаксической необходимостью во всех оболочках, поскольку пробелы без кавычек используются для разделения нескольких аргументов.

Не только пробелы требуют заключения в кавычки, но и любые так называемые метасимволы PowerShell (символы, которые при использовании без кавычек имеют синтаксическая функция); например, передача пути к каталогу с буквальным названием a;b также требует заключения в кавычки, поскольку в противном случае ; будет интерпретироваться как разделитель операторов.

Существует несколько стилей цитирования :

  • Поскольку ваш путь является буквальным и не содержит ссылок на переменные или выражений, лучшим выбором будет '...'-цитирование (одинарное-цитирование).
    Используйте "..."- заключение в кавычки (двойное заключение в кавычки), если ваш путь содержит переменные или подвыражения, т. е. если вам нужна расширяемая строка (интерполирующая строка).[1]
    См. этот ответ для обзора строковых литералов в PowerShell.

  • Другое, менее распространенное решение — отдельно экранировать символы пробела с помощью `, управляющего символа PowerShell: cd C:\Users\Robert` Inspiron14

Также обратите внимание:

  • Функция PowerShell завершение вкладок автоматически применяет кавычки по мере необходимости.

  • cd.. – это имя встроенной функции в PowerShell, единственной целью которой является подражание cmd.exe (сомнительно разрешающему) поведению (см. ниже). ; функция выполняет синтаксически правильный вызов Set-Location .. (проверьте, выполнив ${function:cd..}), с пробелом, отделяющим имя команды от ее аргумента.


В отличие от cmd.exe:

К сожалению, встроенная команда cd cmd.exe решила не применять свои обычные правила синтаксиса и разрешила такие вызовы, как cd C:\Program Files.

Он никогда не должен был этого делать: на первый взгляд это удобно, но представляет собой проблемное исключение из обычных правил, которое вызывает путаницу.
Обратите внимание, что cmd.exe завершение табуляции правильно заключает в кавычки аргументы, содержащие пробелы.

Точно так же cd.., к сожалению, был разрешен как синтаксически исключительная альтернатива правильному cd .. - см. комментарии к этому ответу для подробностей.


[1] Примечание. "..."-цитирование не обязательно, если вы используете ссылки на переменные в пути, при условии, что любые литеральные компоненты не требуют заключения в кавычки; например, $HOME\foo можно без кавычек, тогда как " рядом с "$HOME\foo bar" необходимы. С подвыражениями ($(...)), правила усложняются, поэтому проще всего использовать < em>всегда используйте с ними "..."-цитирование.

person mklement0    schedule 20.09.2020