2013-09-11 3 views
17

У меня есть следующий код в начале более длинного сценария:

$ScriptPath = Split-Path $MyInvocation.MyCommand.Path 
& $ScriptPath\build_functions.ps1 
& $ScriptPath\build_builddefs.ps1 

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

Split-Path: Cannot bind argument to parameter 'Path' because it is null. 

Интересно, что когда я запускаю весь сценарий Кажется, что эти файлы запускаются отдельно. Есть ли что-то, что мне не хватает в том, как ISE обрабатывает выделение, а не полный скрипт? Не устанавливает ли контекст файловой системы при запуске выделения?

+3

$ MyInvocation.MyCommand.Path будет возвращать только путь, если вызывается из $ сценария: сфера. См. [$ MyInvocation.MyCommand.Path - $ null в редакторе сценариев PowerGUI] (// stackoverflow.com/a/2990762). Рассмотрим другой способ [Что лучше всего определить местоположение текущего скрипта PowerShell?] (// stackoverflow.com/q/5466329) –

ответ

21

$MyInvocation является automatic variable заселено сценарий запуска времени, а затем, если вы выполняете $MyInvocation.MyCommand.Path в powershell console или ISE не заселенной;

, поэтому в вашем тесте $ScriptPath не имеет значения ($null)

+1

$ MyInvocation определенно заполнен в ISE, но он не заполняется полностью при вызове из внутри локальной функции, по крайней мере, это мое быстрое предположение из моего тестирования. Использование вместо '$ PSCommandPath' и' $ PSScriptRoot' для powershell 3.0+ – DoTheEvo

Смежные вопросы