Предварительная проверка сценария Powershell MBR2GPT
Прежде чем я получу лекцию, я знаю...
Но выслушай меня, а потом помоги мне!
Я собрал очень простой сценарий powershell (ради этой проблемы), чтобы попытаться просто запустить предварительную проверку с намерением изменить хост записи для дальнейших действий или выходов в зависимости от результата проверки mbr2gpt:
$MBRVAL = (mbr2gpt /allowfullos /validate)
If($MBRVAL -like "NotSpecified: (Disk layout validation failed for disk 0"){
write-host "Error in MBR Conversion"
}
else{
write-host "Ready for Conversion"
}
Теперь, если вы запустили MBR2GPT, вы можете не получить эту ошибку макета диска (если вы уже не сделали это случайно)
Но ошибка заключается в том, что вы получите, если проверка не пройдена дословно, что приведет к Powershell при запуске на машине с такой ошибкой, присутствующей при проверке.
Тем не менее, «нравится» / соответствует / содержит, ни один из них не работает, и поэтому он постоянно возвращается к другому.
Теперь - фактическая ошибка - это ошибка приложения в виде строки.
mbr2gpt : Disk layout validation failed for disk 0
At line:1 char:12
+ $MBRVAL = (mbr2gpt /allowfullos /validate)
+ CategoryInfo : NotSpecified: (Disk layout validation failed for disk 0:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
Итак, могу ли я ссылаться на это в своем сценарии как на оператор IF или нет, и если да, то как?! :D
1 ответ
Поскольку MBR2GPT.EXE является собственной командой, нам нужно проверять наличие ошибок, перенаправляя поток ошибок в поток успеха с помощью
2>&1
. Если мы не добавим этот оператор перенаправления , ошибки не будут зафиксированы в переменной.
# Redirect error stream to success stream to also capture any errors
$MBRVAL = MBR2GPT.EXE /allowfullos /validate 2>&1
# Check if any error records exist and capture these in variable $errors
If ( $errors = $MBRVAL | Where-Object { $_ -is [System.Management.Automation.ErrorRecord] } ) {
# we found errors. Check the exception message for specific error
switch -regex ($errors.Exception.Message) {
'Disk layout validation failed for disk' {
Write-Host 'Disk layout validation error in MBR Conversion' -ForegroundColor Red
}
Default { Write-Host 'Some other error...' -ForegroundColor Red }
}
}
# if no errors do the following
else {
Write-Host 'Ready for Conversion' -ForegroundColor Green
}
Итак, это была слишком сложная версия, если вам нужно выполнять обработку ошибок на основе ошибки.
Если вас не волнует, в чем ошибка, вы можете использовать более простой подход, используя $LASTEXITCODE
MBR2GPT.EXE /allowfullos /validate
if ($LASTEXITCODE){ # or if ($LASTEXITCODE -ne 0){
Write-Host "Some error occurred..." -ForegroundColor Red
} else {
Write-Host "Success" -ForegroundColor Green
}
Если
$LASTEXITCODE
= что-нибудь кроме 0, то при последнем выполнении собственной команды произошла ошибка.
Вы также можете отреагировать на этот код возврата , основываясь на его значении.
switch ($LASTEXITCODE) {
0 { 'Conversion completed successfully.' }
1 { 'Conversion was canceled by the user.' }
2 { 'Conversion failed due to an internal error.' }
3 { 'Conversion failed due to an initialization error.' }
4 { 'Conversion failed due to invalid command-line parameters.' }
5 { 'Conversion failed due to error reading the geometry and layout of the selected disk.' }
6 { 'Conversion failed because one or more volumes on the disk is encrypted.' }
7 { 'Conversion failed because the geometry and layout of the selected disk do not meet requirements.' }
8 { 'Conversion failed due to error while creating the EFI system partition.' }
9 { 'Conversion failed due to error installing boot files.' }
10 { 'Conversion failed due to error while applying GPT layout.' }
100 { 'Conversion to GPT layout succeeded, but some boot configuration data entries could not be restored.' }
Default {'Undocumented error'}
}