2012-11-28 61 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语句,因为它出现在函数框之外。