1

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

3 に答える 3

3

PowerShell は魔法のようにスクリプトへの変更を検出できず、ISE を閉じて再度開き、スクリプトを再度実行します。それが失敗した場合は、スクリプトの内容を ISE に貼り付けて [実行] ボタンをクリックします。

于 2012-11-28T14:32:48.597 に答える
1

C/C++/C# プログラムとは異なり、"あなた"Mainはこのスクリプトの最後にある関数を呼び出す必要があります。上記のスクリプトを実行すると、定義した関数が作成されます。それらのいずれも実行しません。スクリプトでそれらを呼び出すことによってそれを行う必要があり、それらの呼び出しの 1 つはスクリプト レベル (関数の外側) にある必要があります。

于 2012-11-28T14:54:08.530 に答える
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 ステートメントが最初に実行されます。

于 2012-11-28T17:04:08.407 に答える