Как заставить оператор FOREACH срабатывать при каждом срабатывании get-counter

У меня есть следующий код в использовании:

$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 ответ

Проблема в том, что переменная $ file on Export-Counter оценивается только один раз, когда Export-Counter выполнен. Труба результаты Get-Counter в Foreach-Object и экспортировать внутри него (заставляя $ file переоценивать), но это перезапишет выходной файл в каждой итерации и, к сожалению, Export-Counter не имеет переключателя добавления.

С моей головы вы можете экспортировать в CSV, используя Export-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} 
Другие вопросы по тегам