Ошибка в классах PowerShell, когда скрипт находится в папке, содержащей одинарные кавычки?

359
munrobasher

Сценарии PowerShell моего клиента не работают для нового пользователя, в имени которого есть одинарная кавычка, что означает, что путь к профилю называется «C: \ Users \ Liam'OReilly». Кажется, это ошибка в системе классов PowerShell.

Создайте папку с именем «C: \ Temp'Test» и добавьте Test.ps1:

Write-Host "Test" Class MyClass {} 

Выполните этот скрипт, и вы получите эту ошибку:

Указанное имя сборки или кодовая база недопустимы. (Исключение из HRESULT: 0x80131047) В строке: 1 символ: 1 + & 'C: \ Temp''Test \ Test..ps1' + ~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~ + CategoryInfo: OperationStopped: (:) [], FileLoadException + FullyQualifiedErrorId: System.IO.FileLoadException

Переименуйте папку как просто C: \ Test, и она будет работать без ошибок.

Кто-нибудь получил обходной путь, и что будет лучшим способом сообщить об этой ошибке?

Мой обходной путь сейчас (так как пользователь начинает в понедельник) состоит в удалении символа одинарных кавычек из их отображаемого имени в Office 365, что не идеально.

1
Честно говоря, лучше всего было бы убрать одиночную кавычку с имени на доменной стороне. Вы можете сохранить одинарную кавычку в отображаемом имени, поэтому единственным изменением будет каталог, созданный на компьютере, подключенном к домену. В противном случае вам придется вручную изменять реестр на каждом устройстве, подключенном к домену, в который они входят. [Что касается сообщения об ошибке, сообщите об этом в PowerShell Core, должно быть исправлено в PowerShell 5.] (https://github.com/powershell/powershell/issues) Ramhound 6 лет назад 0
Сотрите это. PowerShell 5.1 представляется последней версией (с закрытым исходным кодом). Если вы сообщите об этом в PowerShell Core, это будет исправлено. * Вы должны убедиться, что текущая бета-версия PowerShell Core не имеет этой проблемы (прежде чем вы сообщите об этом) * Ramhound 6 лет назад 0
Спасибо - в Office 365 / Azure AD мне пришлось переименовать отображаемое имя в «Liam OReilly», так как оно, по-видимому, и контролирует имя каталога профиля пользователя. munrobasher 6 лет назад 0
[Между прочим, проблема уже была сообщена и устранена командой разработчиков PowerShell Core] (https://github.com/PowerShell/PowerShell/issues/6598). Я пошел вперед и отметил это как дубликат, так как проблема была сообщена, и она ссылалась на вопрос, заданный здесь. Я предполагаю, что после исправления обнаруженной проблемы, хотя и немного другой, обнаруженная вами проблема также будет исправлена. Ramhound 6 лет назад 0
Возможный дубликат [«Открыть окно PowerShell здесь» команды контекстного меню проводника File Explorer с именами папок с апострофами (одинарные кавычки)] (https://superuser.com/questions/1310258/open-powershell-window-here-file- проводник-контекстное меню-команд-брейки-с-Fol) Ramhound 6 лет назад 0
Хотя этот недостаток определенно находится в той же области, это не та ошибка, о которой говорилось выше. Вы можете запустить скрипт, используя меню содержимого Проводника (чтобы ошибка была исправлена), но это другая ошибка в выражении класса munrobasher 6 лет назад 0
Затем я призываю вас сообщить о проблеме, но, исходя из прочитанного, обнаруженное вами поведение более или менее нацелено на выбор проекта. Теперь я не буду спорить о том, что предполагаемый выбор дизайна должен существовать, но кажется, что проблема, связанная с одиночной кавычкой, существующей в каталоге, из-за давнего решения о дизайне внутри самого PowerShell (и, вероятно, оно не будет исправлено в PowerShell 5.1 так что вам придется использовать PowerShell Core, если он исправлен) Ramhound 6 лет назад 0

1 ответ на вопрос

0
harrymc

Пост StackOverflow Как получить доступ к путям файлов в Powershell, содержащих специальные символы? имеет три решения проблемы:

  1. Используйте новый escape-символ, %чтобы остановить обычный синтаксический анализ командной строки до конца строки, чтобы не совпадать с кавычками, не останавливаться на точке с запятой и не раскрывать переменные PowerShell. Переменные среды все еще раскрываются при использовании cmd.exeсинтаксиса (например %TEMP%).

  2. Запишите имя файла во временный файл и используйте его оттуда.

  3. Используйте символ backtick (`) для экранирования специального символа. Например :

    $dir = "C:\folder`$name\dir" 
К сожалению, автор может использовать только одно из ваших решений, запустив сценарий из другого каталога. Не зная ничего о сценарии, это может быть невозможно. Ramhound 6 лет назад 0
@Ramhound: это не одно из предложений. Не могли бы вы расширить, почему два из них непригодны для использования? harrymc 6 лет назад 0
Если сценарий содержался в папке с одинарной кавычкой, сценарий даже не запускается, поэтому использование переменной или escape-символа в сценарии не решит проблему автора. Ramhound 6 лет назад 0
@Ramhound: автор может использовать сценарий PowerShell для запуска сценария с одинарными кавычками одним из перечисленных выше способов. harrymc 6 лет назад 0
Возможным решением является запуск только из другой папки, и это сложно, так как скрипт запускается из папки профиля пользователя, в которой есть цитата. Может быть в состоянии скопировать сценарий в другую папку, если он находит одну цитату, но очень грязный munrobasher 6 лет назад 0
Скрипт PowerShell можно запустить из любой папки. Ваша проблема заключается в передаче имени папки в формате, который не понимается как что-то еще. Мое предложение состоит из двух шагов: вызовите скрипт, который преобразует свой аргумент, как указано выше, и передаст его основному скрипту в этом формате. harrymc 6 лет назад 0