Каковы эквиваленты PowerShell && Bash и || операторы?

Необходимо удалить целевую переменную из тестовых данных, а затем дать оставшийся столбец информационного кадра в качестве входных данных для функции прогнозирования. Вы могли бы решить количество несовпадений функций.

Попробуйте это!

random_forest.predict(df_test.drop('Outcomes',axis=1))

Примечание: вам не нужно создавать фиктивные переменные целевых переменных для использования случайного леса или любых моделей на основе дерева решений.

30
задан dreftymac 22 March 2019 в 23:18
поделиться

4 ответа

То, что должен делать Bash, это неявное приведение кода завершения команд к логическому значению при передаче логическим операторам. PowerShell этого не делает, но можно создать функцию для переноса команды и создания того же поведения:

> function Get-ExitBoolean($cmd) { & $cmd | Out-Null; $? }

( $? Это логическое значение, содержащее успех последнего кода выхода )

Имеются два пакетных файла:

#pass.cmd
exit

и

#fail.cmd
exit /b 200

... поведение можно проверить:

> if (Get-ExitBoolean .\pass.cmd) { write pass } else { write fail }
pass
> if (Get-ExitBoolean .\fail.cmd) { write pass } else { write fail }
fail

Логические операторы должны оцениваться так же, как в Bash. Сначала установите псевдоним:

> Set-Alias geb Get-ExitBoolean

Тест:

> (geb .\pass.cmd) -and (geb .\fail.cmd)
False
> (geb .\fail.cmd) -and (geb .\pass.cmd)
False
> (geb .\pass.cmd) -and (geb .\pass.cmd)
True
> (geb .\pass.cmd) -or (geb .\fail.cmd)
True
9
ответ дан James Kolpack 28 November 2019 в 00:18
поделиться

Через много лет после того, как вопрос был впервые задан, позвольте мне кратко изложить состояние дел в PowerShell v5.1 :

  • Bash's / [ Операторы управления && и || 112] не имеют эквивалентов PowerShell , и, поскольку вы не можете определить пользовательские операторы в PowerShell, нет хороших обходных путей :

    • Используйте отдельные команды (в отдельных строках или через ;) и явно проверяйте статус успешности каждой команды с помощью автоматической переменной $?, например:
      command1 -arg1 -arg2; if ($?) { command2 -arg1 } # equivalent of &&
      command1 -arg1 -arg2; if (-not $?) { command2 -arg1 } # equivalent of ||

    • Ниже показано, почему PowerShell -and и -or, как правило, не решение.

  • Был разговор о добавлении их некоторое время назад, но, похоже, он никогда не занимал первое место в списке.

    • Теперь, когда PowerShell стал открытым исходным кодом, была открыта проблема на GitHub .
    • Токены && и || в настоящее время зарезервированы для будущего использования в PowerShell, поэтому есть надежда, что тот же синтаксис, что и в Bash, может быть реализован.
      (Начиная с PSv5.1, попытка что-то вроде 1 && 1 выдает сообщение об ошибке The token '&&' is not a valid statement separator in this version.)

Почему PowerShell -and и -or не являются заменой для && и ||:

операторы управления Bash && (короткое замыкание логического И) и || (короткое замыкание логического ИЛИ) неявно проверять статус успешности команд по их кодам выхода, , не влияя на их выходные потоки ; Например:

ls / nosuchfile && echo 'ok'

Независимо от того, что выводит ls - и вывод stdout (файлы в /), и вывод stderr (сообщение об ошибке при попытке доступа к несуществующему файлу nosuchfile) - передается через , но && проверяет (невидимый) код выхода команды ls, чтобы определить, является ли команда echo - RHS элемента управления && оператор - должен быть выполнен.

ls сообщает о коде выхода 1 в этом случае, сигнализируя об ошибке - поскольку файл nosuchfile не существует - поэтому && решает, что ls не удалось и, применяя короткое замыкание, решает, что команда echo не должна выполняться.
Обратите внимание, что это код выхода 0, который сигнализирует об успехе в мире cmd.exe и bash, тогда как любой ненулевой код выхода указывает на сбой.

Другими словами: && и || Баша работают полностью независимо от выхода команд и действуют только на статус успеха команд. 11118]


-and и -or PowerShell, напротив, действуют только на стандартный (успешный) вывод команд , потребляют его и затем выводит только логический результат операции ; Например:

(Get-ChildItem \, nosuchfile) -and 'ok'

Выше:

  • использует и потребляет успешных (стандартных) выхода - перечисление \ - и интерпретирует его как Boolean ; непустая входная коллекция считается $true в логическом контексте, поэтому, если есть хотя бы одна запись, выражение оценивается как $true.

    • Однако информация об ошибке , полученная из несуществующего файла nosuchfile , пропускается , поскольку ошибки отправляются в отдельный поток.
  • Учитывая, что Get-ChildItem \, nosuchfile возвращает непустой успешный вывод, LHS оценивается как $true, поэтому -and также оценивает RHS, 'ok', но, опять же, потребляет свой вывод и интерпретирует его как логическое значение, которое, как непустая строка, также оценивается как $true.

  • Таким образом, общий результат выражения -and равен $true, что является (единственным успехом) выводом .

Чистый эффект :

  • Результат успеха с обеих сторон выражения -and равен ] потребляется во время оценки и, следовательно, эффективно скрыто .

  • Единственным (успешным) выводом выражения является его логический результат , который в данном случае равен $true (который отображается как True в терминале в англоязычных системах).

    [+1193]
26
ответ дан mklement0 28 November 2019 в 00:18
поделиться

Мы можем использовать метод try catch finally вместо использования & amp; & amp; метод в powershell.

try {hostname} catch {echo err} finally {ipconfig /all | findstr bios}
-1
ответ дан Arount 28 November 2019 в 00:18
поделиться

Можно сделать что-то вроде этого, где Вы скрываете булев вывод с [пустотой] и только получаете побочный эффект. В этом случае, если $a или $b являются пустыми, то $c присвоен $result. Присвоение может быть выражением.

$a = ''
$b = ''
$c = 'hi'

[void](
  ($result = $a) -or
  ($result = $b) -or
  ($result = $c))

$result

производит

hi
-1
ответ дан 28 November 2019 в 00:18
поделиться
Другие вопросы по тегам:

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