Несмотря на то, что обходной путь уже найден, я подумал, что людей может заинтересовать объяснение.
О том, почему он ведет себя по-разному в оболочке по сравнению с cmd.exe, см. call-vs-from-the-ise">Powershell 2.0 — запуск скриптов для вызова из командной строки по сравнению с ISE
Как упоминалось в справочнике, между следующими двумя командами есть разница:
powershell ".\test.ps1"
powershell -File ".\test.ps1"
При использовании первого синтаксиса кажется, что он нарушает область действия, заставляя команду Set-StrictMode изменять строгий режим для функций, определенных в глобальной области.
Это вызывает ошибку (или, возможно, неправильное предположение) в определении функции mkdir.
Функция использует метод GetSteppablePipeline для передачи конвейера командлету New-Item. Однако автор не учел тот факт, что секция PROCESS все еще выполняется, даже если в конвейере ничего нет. Таким образом, при достижении раздела PROCESS автоматическая переменная $_ не определяется. Если включен строгий режим, произойдет исключение.
Один из способов для Microsoft учесть это — заменить следующую строку:
$steppablePipeline.Process($_)
со следующим:
if (test-path Variable:Local:_) {
$steppablePipeline.Process($_)
}
Я признаю, что это может быть не лучший способ исправить это, но накладные расходы будут незначительными. Другим вариантом было бы как-то проверить, пуст ли конвейер в разделе BEGIN, а затем установить $_ в $null.
В любом случае, если вы запускаете свои сценарии с синтаксисом «powershell.exe -File filename», вам не нужно об этом беспокоиться.
person
Artomegus
schedule
01.07.2011