Почему функции недоступны локально до первого запуска? - PullRequest
4 голосов
/ 17 декабря 2011

У меня здесь два вопроса, почему при запуске сценария не распознается следующая функция в сценарии:

Сценарий:

$pathN = Select-Folder
Write-Host "Path " $pathN

function Select-Folder($message='Select a folder', $path = 0) { 
  $object = New-Object -comObject Shell.Application  

  $folder = $object.BrowseForFolder(0, $message, 0, $path) 
    if ($folder -ne $null) { 
        $folder.self.Path 
    } 
} 

Я получаю сообщение об ошибке:

The term 'Select-Folder' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try aga

in.

Но если я загрузлю и запусту его в Windows Powershell ISE, он выдаст мне ошибку в первый раз, а затемдействуйте так, как будто он «зарегистрировал» функцию и после этого будет работать.

И в случае, если это процедурная проблема, я попытался перечислить функцию вверху, но безуспешно.

Примечание Я пробовал простые функции, такие как:

Write-host "Say "
Hello

function Hello {
  Write-host "hello"
}

С теми же точными результатами / ошибкой, он жалуется, что Hello не является функцией ....

Кроме того, этовсе еще не каждая работа просто выполняет сценарий в powershell (только в ISE после первой начальной попытки).

1 Ответ

12 голосов
/ 17 декабря 2011

Вам необходимо объявить вашу Select-Folder функцию, прежде чем пытаться ее использовать. Сценарий читается сверху вниз, поэтому при первом проходе, когда вы пытаетесь использовать Select-Folder, он понятия не имеет, что это значит.

Когда вы загрузите его в Powershell ISE, он узнает, что означает Select-Folder при первом запуске, и все равно будет знать, что во второй раз вы попытаетесь запустить его (чтобы вы не получили ошибку то).

Так что если вы измените свой код на:

function Select-Folder($message='Select a folder', $path = 0) { 
  $object = New-Object -comObject Shell.Application  

  $folder = $object.BrowseForFolder(0, $message, 0, $path) 
    if ($folder -ne $null) { 
        $folder.self.Path 
    } 
} 

$pathN = Select-Folder
Write-Host "Path " $pathN

, который должен работать каждый раз, когда вы запускаете его.

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