我無法理解PowerShell如何對待功能。在下面的腳本中,所有函數都被調用,即使我從未實際調用過主函數。 PowerShell是不是有一個呼叫鏈的概念?PowerShell函數被調用
param([string]$directory)
[string]$global:sqlscript;
$global:types = @{
"double" = "DOUBLE PRECISION";
"int" = "INTEGER";
"QString" = "INTEGER";
"Ignored" = "1";
"Normal" = "2";
"Critical" = "3" }
function resultToSql($element)
{
$global:sqlscript += ('"')
$global:sqlscript += ($element.name + '" ')
$global:sqlscript += ($global:types.Get_Item($element.type))
$global:sqlscript += (',' + [Environment]::Newline)
$global:sqlscript += ('"' + $element.name + "_metric_group" + " " + $global:types.Get_Item($element.metric_group.type))
$global:sqlscript += (',' + [Environment]::Newline)
}
function xmlToSql($source)
{
Write-Host "Parsing...";
$global:sqlscript += "CREATE TABLE IF NOT EXISTS " + '"' + $source.spec.task.ToLower() + '"'+ [Environment]::NewLine
$global:sqlscript += '"' + "id" + '"' + " SERIAL NOT NULL" + [Environment]::NewLine
foreach ($node in $source.spec.measure) {
resultToSql $node
}
foreach ($m in $source.spec.error) {
resultToSql $m
}
$global:sqlscript += '"' + "weighted_sum" + '" ' + $global:types.Get_Item("double") + [Environment]::Newline;
}
function main
{
if ($directory -eq $null) { exit }
else
{
$xmlfiles = Get-ChildItem -Path $directory -include *Spec.xml
foreach ($xmlfile in $xmlfiles)
{
Write-Host "Filename:" $xmlfile;
[xml]$spec = Get-Content $file;
xmlToSql $spec;
Write-Host $script;
}
}
}
我很驚訝,因爲主要不是在腳本調用。 –
我救了你發佈的腳本'a.ps1',並用'a.ps1執行其「C:\ TEMP」'(已增加額外寫主機確認),並在控制檯上看到無輸出(即沒有函數被調用)。請你能澄清你如何執行這個腳本? –
我從PowerShell的命令行ISE稱之爲 「\ script.ps1 C:\路徑\到\ specxmls \」 不帶引號。這是一個黑暗中的鏡頭,但powershell以某種方式緩存腳本?我收到了一些奇怪的行爲,好像它沒有在腳本中註冊更改。即使沒有參數運行它也會產生似乎來自早期執行的輸出。 –