我开发了一个Powershell Cmdlet和一个驱动它的脚本。我发现Cmdlet的功能在Powershell ISE中运行得非常快,并且还通过命令行调用的包装器EXE(比如2分钟)运行。但是,如果我通过powershell.exe -File
在CMD中调用脚本,则相同的操作需要6-7分钟。
脚本基本上通过System.Reflection.Assembly.LoadFile
加载一些DLL,通过Add-Type
加载一个完整的配置信息类型,然后调用自定义Cmdlet(一次不在循环中)。 Cmdlet功能涉及大量数据库访问,网络存储访问和处理。我无法发布任何类型的源代码。
我发现在ISE和命令行中,ApartmentState都是STA,主机版本(Major,Minor,Build,Revision)是(3,0,-1,-1)。
我的问题是:有哪些进一步的检查可以确定执行时间差异的原因?
答案 0 :(得分:1)
我的问题是:有哪些进一步的检查可以确定执行时间差异的原因?
您是否考虑过现有的调试选项?
您可以在战略位置打包几个WriteVerbose()
语句:
using System;
using System.Management.Automation;
using System.Diagnostics;
class DoDatabaseStuffCommand : PSCmdlet
{
private Stopwatch stopWatch;
//
// ... parameter definitions go here
//
protected override void BeginProcessing()
{
stopWatch = Stopwatch.StartNew();
// load whatever you need
this.WriteVerbose(String.Format("Loading dependencies: {0}s", stopWatch.Elapsed.TotalSeconds));
}
protected override void ProcessRecord()
{
this.WriteVerbose(String.Format("Processing item at {0}s", stopWatch.Elapsed.TotalSeconds));
// process input
this.WriteVerbose(String.Format("Done processing item at {0}s", stopWatch.Elapsed.TotalSeconds));
}
protected override void EndProcessing()
{
this.WriteVerbose(String.Format("Starting cleanup at {0}s", stopWatch.Elapsed.TotalSeconds));
// clean up
this.WriteVerbose(String.Format("Done cleaning up at {0}s", stopWatch.Elapsed.TotalSeconds));
stopWatch.Stop();
}
}
在调用脚本中,您可以改为使用Write-Verbose
:
$stopwatch = [System.Diagnostics.StopWatch]::StartNew()
foreach($assembly in $assemblies){
Add-Type -Path $assembly
Write-Verbose "Done loading $assembly after $($stopwatch.Elapsed.TotalSeconds)s"
}
# and so on
使用-Verbose
执行以查看正在进行的操作:
powershell.exe -File "\path\to\script.ps1" -Verbose