2012-11-28 59 views
1

我無法理解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; 
    } 
    } 
} 
+0

我很驚訝,因爲主要不是在腳本調用。 –

+0

我救了你發佈的腳本'a.ps1',並用'a.ps1執行其「C:\ TEMP」'(已增加額外寫主機確認),並在控制檯上看到無輸出(即沒有函數被調用)。請你能澄清你如何執行這個腳本? –

+0

我從PowerShell的命令行ISE稱之爲 「\ script.ps1 C:\路徑\到\ specxmls \」 不帶引號。這是一個黑暗中的鏡頭,但powershell以某種方式緩存腳本?我收到了一些奇怪的行爲,好像它沒有在腳本中註冊更改。即使沒有參數運行它也會產生似乎來自早期執行的輸出。 –

回答

0

不同於C/C++/C#程序中,「你」需要調用Main功能 - 在這個腳本的底部。當你運行腳本時首先要創建你定義的函數。它不運行任何它們。您必須通過在腳本中調用它們來完成此操作,並且其中一個調用必須位於腳本級別(任何函數之外)。

+0

被認爲是答案,再加上Keith Hill關於ISE「模擬功能輸出」的評論(請參閱他對最初問題的評論) –

+0

稍作修改:@ Keith的評論是它模擬**輸入**,而不是**輸出**。 –

+0

@msorens是的,這就是我的意思(輸入)。感謝您指出更正。 –

2

PowerShell無法神奇地檢測腳本的變化,關閉ISE並重新打開它,然後再次運行您的腳本。如果失敗了,你的腳本的內容會粘貼到ISE中,然後點擊執行按鈕,我只是這樣做了,主要沒有運行。

+0

我想了解什麼時候PowerShell確實或沒有檢測到更改。我認爲當涉及到主要腳本時,一切正常。如果碰巧在同一個文件上使用了一個函數,並且在這個函數中改變了一些東西,ISE需要重啓。是這樣嗎? – Entrodus

0

拆下主函數容器使其類似於下面的代碼:

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; 
    } 
    } 

PowerShell不會從主執行如C#/ C++。它執行哪些語句首先被接收到函數之外。在上面的例子中,它會首先執行if語句,因爲它出現在函數框之外。