Powershell эквивалент Linux истинной команды - PullRequest
2 голосов
/ 26 марта 2019

Этот ответ stackoverflow объясняет, что такое команда Linux true. Мой вопрос, предлагает ли Powershell (v5 / v6) и настоящую команду?

Я уже погуглил, использовал Get-help *true*, но ничего не смог найти по этому поводу.

Thx

Ответы [ 2 ]

4 голосов
/ 26 марта 2019

Короче говоря:

  • Не существует PowerShell, эквивалентного утилитам true и false Unix.

  • Поскольку условные выражения и обработка ошибок в PowerShell работают совсем иначе, чем в POSIX-подобных оболочках, таких как bash, в них нет необходимости.

Основное использование утилиты Unix true - сброс кода выхода на 0 в ситуациях, когда вы намеренно хотите игнорировать ошибку предыдущей команды (сигнализируется через ненулевой код выхода) в POSIX-подобных оболочках, таких как bash, например, в условных выражениях или с опцией прерывания при необработанных сбоях set -e в действии.
Ни true, ни его аналог false не производят никакого вывода - их единственная цель - установить код выхода .

PowerShell не использует исходные коды выхода (хотя вы можете установить их для внешних абонентов с помощью exit <n>), а его условия выполняют , а не действуют на них .

  • PowerShell автоматическая $? переменная аналогично абстрактному $? в POSIX-подобных оболочках, за исключением того, что она сообщает Boolean , тогда как POSIX-подобная снаряды сообщают код выхода ; то есть $?, содержащий 0 в POSIX-подобной оболочке, похож на $?, содержащий $true в PowerShell.

  • PowerShell никогда не действует на $? неявно , но вы можете использовать его в условных выражениях PowerShell явно , так что следующие две - придуманные для простоты - команды будут эквивалент:

    # POSIX-like shells:
    # Event though the `ls` command fails `|| true` makes the overall
    # command succeed.
    if ls /nosuchfile || true; then echo success; fi
    
    # PowerShell:
    # `$?` would reflect `$false` after the failed `ls` command.
    # `$null = $null` is a dummy command that resets `$?` to `$true`
    # `$?` is then *output* for the `if` to test.
    if ($(ls /nosuchfile; $null = $null; $?)) { 'success' }
    

В то время как PowerShell имеет автоматические $true и $false переменные (концептуально, константы), они являются логическими значениями , используемыми для сравнения с вывод (данные), не команды , которые устанавливают невидимая информация о состоянии (коды выхода).

Продолжайте читать для справочной информации.


Условия в POSIX-подобных оболочках и в PowerShell

В POSIX-подобных оболочках , таких как bash, условные операторы работают с кодами выхода команд, т.е. (после выполнения) информация о состоянии , а не их вывод .

Напротив, условные выражения PowerShell работают с командой или выражением вывод , т.е. данные , а не информация о состоянии.

Короче говоря:

  • Условные обозначения в POSIX-подобных оболочках действуют на невидимые коды выхода и , пропускающие вывод об успешном выполнении (вывод stdout) через .

  • Условные обозначения в PowerShell действуют на успешный вывод и потребляют его в процессе.

Обе оболочки проходят Ошибка Вывод (stderr) через.


Если вы хотите, чтобы условное ядро ​​PowerShell воздействовало на команду (после выполнения) статус (успех против сбоя):

Вы можете использовать автоматическую $? переменную , поведение которой зависит от того, является ли данная команда родной для PowerShell или от внешней программы, такой как утилита Unix:

  • Внешние программы: Если код завершения программы 0, $? отражает $true, в противном случае $false

    • Это похоже на встроенную переменную $? в POSIX-подобных оболочках, таких как bash, за исключением того, что $? содержит действительный код выхода ; то есть $?, содержащий 0 в POSIX-подобной оболочке, совпадает с $?, содержащим $true в PowerShell после выполнения внешней программы.

      • Чтобы получить фактический код завершения в PowerShell, используйте автоматическую $LASTEXITCODE переменную , которая отражает код завершения самой последней выполненной внешней программы (обычно для PowerShell-собственных командне устанавливайте коды выхода, хотя вы можете использовать exit <n> в сценариях, главным образом для сообщения кодов выхода внешним абонентам ).
  • родные команды PowerShell (командлеты, функции, сценарии): $? равно $true, если команда не имела принципиального сбоя и не записывала в поток ошибок PowerShell (например, с Write-Error); обратите внимание, что stderr вывод из внешних программ по умолчанию не записывает в поток ошибок PowerShell).

    • Обратите внимание, что $? поэтому не обязательно сообщаетвы считаете, была ли данная команда в целом успешной или нет;$? будучи $false просто говорит вам только о том, что произошла некоторая ошибка .
    • Однако вы можете обернуть вызов команды в оператор try { ... } catch { ... } ,который помогает вам отличать не завершающиеся от завершающие ошибки (по умолчанию только последний вызывает блок catch);

Использование $? не распространено в PowerShell , поскольку сбой обычно обрабатывается с помощью общего параметра
-ErrorAction / $ErrorActionPreference переменная предпочтения и / или try { ... } catch { ... } операторы.

Тем не менее, эти методы нельзя использовать в внешних программах , где тестирование $? или$LASTEXITCODE является обязательным для обнаружения сбоя.
Это обсуждение GitHub и в этом проекте RFC требует лучшей интеграции внешних программ с PowerShell.обработка ошибок.

Полный обзор обработки ошибок PowerShell см. в этой проблеме GitHub .

1 голос
/ 26 марта 2019

То, что вы ищете, это тема about_Automatic_Variables , где описаны переменные $true и $false.

Я написал это как ответ, потому что хотелчтобы указать на «поймал», я столкнулся с этими значениями: 0 и 1 равны $false и $true соответственно.

$false -eq 0 # => True
$false -eq $null # => False - not false-y?

$true -eq 1 # => True
$true -eq 2 # => True - appears to be truth-y

Между тем строка 'false' не является.

$false -eq 'False' # => False

Также по какой-то причине $false равно пустой строке:

$false -eq '' # => True
$false -eq [string]::Empty # => True

В то время как строка 'true' IS равна $true(действительно, любое ненулевое число и любая непустая строка):

$true -eq 'True' # => True

В процессе написания этого ответа я понял, что многие $true сравнения оцениваются как True, поэтому можно предположить, что сравнения с константами bool являются true-y / false-y.

Вот значения, которые сравниваются с $false (что делает следующие сравнения возвращаемыми $true):

$false -eq ''  # Empty string
$false -eq 0   # Zero
$false -eq @() # Empty array

Единственное обнаруженное мной сравнение, которое провалило оба теста, это $null (т.е. не на 100% ложь-у):

$false -eq $null # => False
$true -eq $null  # => False

Вкл.Последний пример крайнего случая, который оценивается как $false в некоторых других языках, является пустым [hashtable] (или словарем):

$true -eq @{} # => True

Суммируя, что @ Joey указано в комментариях:

╦═════════════════════╦═════════════════════════╗
║ Falsy               ║ Truthy                  ║
╠═════════════════════╬═════════════════════════╣
║ 0                   ║ Non-0                   ║
║ @()                 ║ @(1)                    ║
║ @(0)                ║ @(0, 1)                 ║
║ [string]::Empty     ║ Non-empty string        ║
║ $false              ║ $true                   ║
║ 0-backed enum value ║ Any non-0 enum value    ║
║ $null               ║ Any non-$null reference ║
╚═════════════════════╩═════════════════════════╝
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...