为什么函数在第一次运行之后才在本地可用?

时间:2011-12-17 16:21:22

标签: powershell powershell-v2.0

我在这里有两个问题,为什么在运行脚本时脚本中无法识别以下函数:

脚本:

$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

但是,如果我在Windows Powershell ISE中加载并运行它,它将在第一次给我错误,然后表现得已经“注册”了该函数并在此之后工作。

如果这是一个程序问题,我已经尝试将功能列在顶部而没有更好的运气。

注意我尝试过简单的功能,如:

Write-host "Say "
Hello

function Hello {
  Write-host "hello"
}

使用完全相同的结果/错误,它会抱怨Hello不是函数....

此外,它仍然不会在PowerShell中运行脚本(仅在第一次初始尝试后的ISE中)。

1 个答案:

答案 0 :(得分:12)

在尝试使用之前,您需要声明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

每次运行时都应该有效。