Вопрос по – Что такое `$?` В Powershell?

39

Каково значение$? в Powershell?

Редактировать:TechNet ответы в тавтологии, не объясняя, что «удалось»; или «провал» имею в виду.

$?
Contains the execution status of the last operation. It contains TRUE if the last operation succeeded and FALSE if it failed.

Я предположил $? будет просто проверить, равен ли $ LastExitCode 0, но я нашелконтрпример где $? Ложь, но $ LastExitCode - Истина.

В Powershell,$? является примером "автоматической переменной". Это помогло мне узнать номенклатуру. Baodad

Ваш Ответ

3   ответа
0

Вы также можете получить доступ к последнему коду выхода, используя$LastExitCode параметр.

# run some command
# ...
if ((! $?) -and $ErrorAction -eq "Stop") { exit $LastExitCode }
38

true если последняя команда была успешной, иначеfalse.

Однако существует ряд предостережений и неочевидного поведения (например, что именно подразумевается под «успехом»). Я настоятельно рекомендую прочитатьЭта статья для более полного лечения.

Например, рассмотрим вызов Get-ChildItem.

PS> Get-ChildItem 

PS> $? 
    True

$? вернусьTrue как вызов Get-ChildItem успешно.

Однако, если вы вызовете Get-ChildItem для несуществующего каталога, он вернет ошибку.

PS> Get-ChildItem \Some\Directory\Which\Does\Not\Exist
    Get-ChildItem : Cannot find path 'C:\Some\Directory\Which\Does\Not\Exist' because it does not exist.

PS> $?
    False

$? вернусьFalse здесь, так как предыдущая команда не была успешной.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Colonel Panic
Error: User Rate Limit Exceeded Colonel Panic
Error: User Rate Limit Exceededstackoverflow.com/questions/10666101/… Colonel Panic
5

$? будет содержать$false если последняя команда привела к ошибке. Будет содержать$true если это не так. вPowerShell v1 дни, это был обычный способ обработки ошибок. Например, в сценарии, если вы хотите проверить наличие файла, а затем распечатать пользовательское сообщение, если это не так, вы можете сделать следующее:

if( -not $?)
{
    'could not find file.';
     exit
 }`
@mikemaccana, в той же лодке здесь ... Я думаю, что попытка / ловить заявления.
try / catch доступен в PS, но исключения только "выловлены" когда есть завершающая ошибка. Часто командлет не завершает выполнение, но продолжает работу. В этих случаях $? Вы - альтернатива?
Что люди делают сейчас вместо этого?

Похожие вопросы