Проблема с правильным функционированием скрипта

#powershell

Вопрос:

У меня есть запрос, если кто-нибудь может помочь найти ошибку в настройке виртуальной памяти с помощью скрипта, если у вас меньше 8 ГБ оперативной памяти, скрипт вместо настройки 8 ГБ переходит к настройке варианта для 16 ГБ оперативной памяти

 $Result = (Get-CimInstance -ClassName Win32_PhysicalMemory | Measure-Object -Property Capacity -Sum).Sum / 1GB
$DriveLetter = (Get-CimInstance -ClassName Win32_Volume | Where-Object -FilterScript {$_.PageFilePresent}).DriveLetter[0]
switch ($Result)
{
    {$PSItem -le 7}
    {
        Write-Verbose "Masz $($PSItem) GB pamięci! Zmiana pliku stronicowania na poczatkowy: 8 GB - maks .: 8 GB" -Verbose
 
        Start-Sleep -Seconds 5
 
        Get-CimInstance -ClassName Win32_ComputerSystem | Set-CimInstance -Property @{AutomaticManagedPageFile = $false}
        Get-CimInstance -ClassName Win32_PageFileSetting | Where-Object -FilterScript {$_.SettingID -eq "pagefile.sys @ $($DriveLetter):"} | Set-CimInstance -Property @{
            InitialSize = 8192
            MaximumSize = 8192
        }
    }
    {$PSItem -le 31}
    {
        Write-Verbose "Masz $($PSItem) GB pamięci! Zmiana pliku stronicowania na poczatkowy: 16 GB - Max 16 GB" -Verbose
 
        Start-Sleep -Seconds 5
 
        Get-CimInstance -ClassName Win32_ComputerSystem | Set-CimInstance -Property @{AutomaticManagedPageFile = $false}
        Get-CimInstance -ClassName Win32_PageFileSetting | Where-Object -FilterScript {$_.SettingID -eq "pagefile.sys @ $($DriveLetter):"} | Set-CimInstance -Property @{
            InitialSize = 16384
            MaximumSize = 16384
        }
    }
    {$PSItem -ge 32}
    {
        Write-Verbose "Masz $($PSItem) GB pamięci! Zmiana pliku stronicowania na poczatkowy: 8 GB - Max 8 GB" -Verbose
 
        Start-Sleep -Seconds 5
 
        Get-CimInstance -ClassName Win32_ComputerSystem | Set-CimInstance -Property @{AutomaticManagedPageFile = $false}
        Get-CimInstance -ClassName Win32_PageFileSetting | Where-Object -FilterScript {$_.SettingID -eq "pagefile.sys @ $($DriveLetter):"} | Set-CimInstance -Property @{
            InitialSize = 8192
            MaximumSize = 8192
        }
    }
}
 

Комментарии:

1. Подсказка: У вас есть ДВА условия «Меньше» для одной и той же переменной. Откуда ты знаешь, что он работает правильно? Меньше 7-это тоже меньше 31 :). Это, вероятно, одна из ситуаций, когда используется If..ElseIf… Тогда это лучшая стратегия, чем переключиться.

2. Если бы вы преобразовали это в If..ElseIf... и перевернули порядок, то это было бы легче решить. if ($PSitem -ge 32){}...elseIf ($PSItem -ge 8 -and $PSItem -lt 16)...Else{#must be below 8 gb}

Ответ №1:

Я ничего не вижу break в вашем switch заявлении, все возможности оцениваются без break «а». Кстати, вы говорите меньше 8, но в вашем заявлении я вижу меньше или равно 7. В любом случае, предположим, что у вас 4 ГБ оперативной памяти, с вашим заявлением вы войдете в первое условие, потому что 4 меньше или равно 7, и вы также войдете во второе условие, потому что 4 меньше или равно 31.

При работе с switch just remember очень важно использовать перерывы, если вы не хотите продолжать оценивать следующие условия.

Попробуйте приведенный ниже код с и без break и посмотрите, что произойдет:

 $eval=4

switch($eval)
{
    {$_ -le 7}
    {
        "$_ is lower or equal to 7"
        break
    }
    {$_ -le 31}
    {
        "$_ is lower or equal to 31"
        break
    }
    Default
    {
        "$_ is higher than 31"
    }
}