Как добавить обработку исключений в этот код PowerShell? - PullRequest
1 голос
/ 27 января 2020

Применение обработки исключений с помощью try-catch для System.OutOfMemoryException

Вот текущий код:

Я новичок в PowerShell, и я не уверен, где в этом коде должен использоваться try-catch go. Предполагается, что он охватывает весь код?

# This forces the user to choose a value 1-5, a certain output is returned 
# depending on number choice
while ($true) {
    $input = Read-Host "Enter the option 1-5"
    if ($input -eq 5) {
        break
    }
    switch ( $input ) {
        # Gets current date and time
        1 {
            $temp = Get-Date
            $answer = Get-ChildItem | Where-Object { $_.Name -match "[A-Z,a-z,0-9]*[.][l][o][g]" }
            echo $temp $answer
            echo $temp $answer >> DailyLog.txt
        }
        # Lists files
        2 {
            $answer = Get-ChildItem | Sort-Object -Property name | select name
            echo $answer
            echo $answer >> C916contents.txt
        }
        # Lists current CPU processing percentage and memory usage
        3 {
            Get-Counter -Counter '\Process(_total)\% Processor Time' -MaxSamples 4 -SampleInterval 5
            Get-Counter -Counter '\\desktop-l8dtt4r\physicaldisk(_total)\current disk queue length' -MaxSamples 4 -SampleInterval 5
        }
        # Gets current running procces on PC
        4 {
            Get-Process | Sort-Object -Property cpu
        }
    }
}

1 Ответ

0 голосов
/ 27 января 2020

Существует 4 случая, и большинство случаев не вызовет исключения System.OutOfMemoryExceptions. Когда вы имеете дело с Get-Content или Get-ChildItems, существует вероятность того, что вы прочтете столько данных, что скрипт выдаст исключение System.OutOfMemoryException. Но варианты 1 и 2 читают только определенные папки, ничего рекурсивного в них нет, поэтому вероятность возникновения исключения System.OutOfMemoryException менее вероятна.

вариант 4 также считывает процессы системы и сортирует их на основе ЦП. , Также не используется много памяти для генерации исключения.

Вариант 3 интересен, но тот факт, что он получает только счетчики и ничего не хранит, не может показаться, что это также приведет к возникновению какого-либо исключения system.OutOfMemoryException.

Я запустил все 4 сценария ios, и ни один из них не вызывает проблем с памятью.

Я бы порекомендовал включить весь оператор switch в блок try / catch с System.OutOfMemoryException, так как вы запускаете весь переключатель за некоторое время l oop. Это может быть любой из вариантов, которые могут вызвать ошибку.

  try {
    switch ( $input ) {
      # Gets current date and time
      1 {
        $temp= Get-Date
        $answer = Get-ChildItem | Where-Object { $_.Name -match "[A-Z,a-z,0-9]*[.][l] 
        [o][g]" }
        echo $temp $answer
        echo $temp $answer >> DailyLog.txt
      }
      # Lists files
      2 {
        $answer = Get-ChildItem | Sort-Object -Property name | select name
        echo $answer
        echo $answer >> C916contents.txt
      }
      # Lists current CPU processing percentage and memory usage
      3 {    
        Get-Counter -Counter '\Process(_total)\% Processor Time' -MaxSamples 4 -SampleInterval 5
        Get-Counter -Counter '\\desktop-l8dtt4r\physicaldisk(_total)\current disk queue length' -MaxSamples 4 -SampleInterval 5
      }
      # Gets current running procces on PC
      4 {
        Get-Process | Sort-Object -Property cpu
      }
    }
  }
  Catch [System.OutOfMemoryException] {
    Write-Output "OutOfMemoryException occured."
  }
  Catch {
    Write-OUtput "Something else happened: $($_.Exception.Message)"
  }
...