#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"
}
}