Function Powershell函数无论调用与否都会执行
我很难理解Powershell如何处理函数。在下面的脚本中,所有函数都被调用,即使我从未真正调用过主函数。powershell没有呼叫链的概念吗Function Powershell函数无论调用与否都会执行,function,powershell,Function,Powershell,我很难理解Powershell如何处理函数。在下面的脚本中,所有函数都被调用,即使我从未真正调用过主函数。powershell没有呼叫链的概念吗 param([string]$directory) [string]$global:sqlscript; $global:types = @{ "double" = "DOUBLE PRECISION"; "int" = "INTEGER"; "QString" = "INTEGER"; "Ignored" = "1"; "Normal" = "
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;
}
}
}
PowerShell无法神奇地检测到对脚本的更改,请关闭ISE并重新打开它,然后再次运行脚本。如果失败,请将脚本内容粘贴到ISE并单击“执行”按钮,我只是这样做了,main没有运行。PowerShell无法神奇地检测到对脚本的更改,请关闭ISE并重新打开它,然后再次运行脚本。如果失败,请将脚本内容粘贴到ISE中,然后单击执行按钮,我只是这样做了,main没有运行。与C/C++/C#程序不同,“您”需要调用脚本底部的
main
函数。当您运行脚本时,它首先要做的就是创建您定义的函数。它没有运行任何一个。您必须在脚本中调用它们,其中一个调用必须在脚本级别(在任何函数之外)。与C/C++/C#程序不同,“您”需要调用此脚本底部的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;
}
}
Powershell不像C#/C++那样从Main执行。它执行函数外部首先接收到的语句。在上面的这种情况下,它将首先执行if语句,因为它出现在函数框外部。删除主函数容器,使其类似于下面的代码:
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++那样从Main执行。它执行函数外部首先接收到的语句。在上面的这种情况下,它将首先执行出现在函数框外的if语句。我很惊讶,因为脚本中没有调用main。我已将您发布的脚本保存为
a.ps1
,并使用a.ps1“c:\temp”
执行它(添加了额外的写入主机以供确认),在控制台上看不到任何输出(即未调用任何函数)。请澄清您是如何执行此脚本的?我是从Powershell ISE命令行调用它的。“\script.ps1 C:\path\to\specxmls\”没有引号。这是瞎猜,但是powershell会缓存脚本吗?我有一种奇怪的行为,似乎它没有注册对脚本的更改。即使在没有参数的情况下运行它,也会生成似乎来自早期执行的输出。不使用64位版本似乎可以纠正这种行为关于ISE或shell。作为记录,原始问题仍然没有回答。函数仍然只是通过定义它们来产生输出。我很惊讶,因为脚本中没有调用main。我已将发布的脚本保存为a.ps1
,并使用a.ps1“c:\temp”
执行它(添加了额外的写主机以供确认)在控制台上看不到任何输出(即未调用任何函数)。请澄清您是如何执行此脚本的?我正在从Powershell ISE命令行调用它。“\script.ps1 C:\path\to\specxmls\”没有引号。这是瞎猜,但是powershell会缓存脚本吗?我有一种奇怪的行为,似乎它没有注册对脚本的更改。即使在没有参数的情况下运行它,也会生成似乎来自早期执行的输出。不使用64位版本似乎可以纠正这种行为关于ISE或shell。为了记录在案,原始问题仍然没有答案。函数仍然仅仅通过定义它们来产生输出。判断为答案,再加上基思·希尔关于ISE“模拟函数输出”的评论(见他对初始问题的评论)关于这一点的微小更正:@Keith的评论是它是模拟输入,而不是输出。@msorens是的,这就是我的意思(输入)。感谢你指出这一更正。判断为答案,再加上Keith Hill关于ISE“模拟函数输出”的评论(见他对初始问题的评论)对此做了轻微的修正:@Keith的评论是它模拟输入,而不是输出。@msorens是的,这就是我的意思(输入)。感谢您指出更正。我正在尝试了解powershell何时检测到更改或未检测到更改。我认为当涉及到主脚本时,一切正常。如果您碰巧在同一文件上使用了一个函数并更改了此函数中的某些内容,ISE需要重新启动。是这样吗?我正在尝试了解powershell何时检测到更改ell是否检测到更改。我认为当涉及到主脚本时,一切正常。如果您碰巧在同一个文件上使用了一个函数并更改了该函数中的某些内容,ISE需要重新启动。是这样吗?