每次get-counter触发时如何触发FOREACH语句

时间:2013-05-29 17:40:16

标签: powershell foreach perfmon

我正在使用以下代码:

$Folder="C:\Perflogs\BBCRMLogs" # Change the bit in the quotation marks to whatever directory you want the log file stored in

$Computer = $env:COMPUTERNAME
$1GBInBytes = 1GB
$p = "LOTS OF COUNTERS";

# If you want to change the performance counters, change the above list. However, these are the recommended counters for a client machine. 

$dir = test-path $Folder 

IF($dir -eq $False) 
{
New-Item $Folder -type directory
$num  = 0
$file = "$Folder\SQL_log_${num}.csv"
Get-Counter -counter $p -SampleInterval 2 -Continuous | 
    Foreach {
        if ((Get-Item $file).Length -gt 1MB) {
            $num +=1;$file = "$Folder\SQL_log_${num}.csv"
        }
        $_
    } | 
    Export-Counter $file -Force -FileFormat CSV
}
Else
{
$num  = 0
$file = "$Folder\SQL_log_${num}.csv"
Get-Counter -counter $p -SampleInterval 2 -Continuous | 
    Foreach {
        if ((Get-Item $file).Length -gt 1MB) {
            $num +=1;$file = "$Folder\SQL_log_${num}.csv"
        }
        $_
    } | 
    Export-Counter $file -Force -FileFormat CSV
}

但是,即使((Get-Item $file).Length -gt 1MB)TRUE,它也不会增加文件。我的想法是,每次采样时都不会调用Foreach循环,因为Get-Counter只被调用一次(然后正在进行)。我不确定我应该使用什么构造来确保它正在通过该循环。我应该将该特定Foreach声明隔离到另一部分,而不是依赖它在get-counter期间被调用吗?批处理文件调用此Powershell脚本,然后get-counter部分在后台运行,收集信息。

1 个答案:

答案 0 :(得分:1)

问题是Export-Counter上的$ file变量仅在执行Export-Counter时评估一次。将Get-Counter的结果传递给Foreach-Object并导出其内部(强制$ file重新评估),但这将覆盖每次迭代中的输出文件,不幸的是Export-Counter没有一个追加开关。

在我的头顶,您可以使用Export-Csv导出到csv,在v3中它支持附加到文件。也就是说,你不会得到相同的csv结构。

还有两件事。在第一次执行脚本时,第一个文件尚未创建,然后检查它的长度。这使文件找不到错误,使用ErrorAction参数来抑制错误。

您无需重复两次代码。检查输出目录是否存在,如果不存在则创建它,然后用脚本的其余部分继续一次。

$Folder = 'D:\temp'
$num  = 0
$file = "$Folder\SQL_log_${num}.csv"

if( !(test-path $folder)) {New-Item $Folder -type directory}

Get-Counter -counter $p -SampleInterval 2 -Continuous | Foreach {

    if ((Get-Item $file -ErrorAction SilentlyContinue ).Length -gt 1mb) 
    {
        $num +=1
        $file = "$Folder\SQL_log_${num}.csv"
    }

    $_

} | Foreach-Object { $_ | Export-Csv $file -Append}