условное выполнение (&& и ||) в powershell

Виртуальные адреса необходимы для запуска нескольких программ на компьютере.

Предположим, что нет механизма виртуальных адресов. Компиляторы и редакторы ссылок генерируют макет памяти с заданным шаблоном. Инструкция (текстовый сегмент) размещается в памяти с адреса 0. Затем идут сегменты для инициализированных или неинициализированных данных (data и bss) и динамической памяти (куча и стек). (см., например, https://www.geeksforgeeks.org/memory-layout-of-c-program/ , если у вас нет представления о разметке памяти)

Когда вы запускаете эту программу он будет занимать часть памяти, которая больше не будет доступна другим процессам совершенно непредсказуемым образом. Например, адреса от 0 до 1M будут заняты, или от 0 до 16k, или от 0 до 128M, это полностью зависит от характеристик программы. Если теперь вы хотите одновременно запустить вторую программу, куда ее инструкции и данные попадут в память? Адреса памяти генерируются компилятором, который, очевидно, не знает во время компиляции, что будет свободной памятью. И помните, что адреса памяти (для инструкций или данных) как-то жестко запрограммированы в программном коде.

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

Виртуальная память упрощает все эти задачи. При запуске процесса (или его восстановлении после перестановки) система просматривает свободную память и заполняет таблицы страниц, чтобы создать сопоставление между виртуальными адресами (управляемыми процессором и всегда неизменными) и физическими адресами (что зависит от свободной памяти на компьютер в данный момент).

31
задан Community 23 May 2017 в 12:32
поделиться

2 ответа

2019: команда Powershell рассматривает возможность добавления поддержки && в Powershell - взвесьте все на этом GitHub PR

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

$(command -arg1 -arg2 | Out-Host;$?) -and $(command2 -arg1 | Out-Host;$?)

$() - это подвыражение, позволяющее указать несколько операторов внутри, включая конвейер. Затем выполните команду и передайте ее на Out-Host, чтобы вы могли ее увидеть. Следующий оператор (фактический вывод подвыражения) должен вывести $?, т.е. результат успеха последней команды.


Выражение $? отлично работает для собственных команд (консольных exe'шников), но для команд оставляет желать лучшего. То есть $?, похоже, возвращает $false только тогда, когда команда сталкивается с ошибкой завершения. Похоже, что для $? необходимо как минимум три состояния (не удалось, удалось и частично удалось). Так что если вы используете команды, то лучше подойдет следующее:

$(command -arg1 -arg2 -ev err | Out-Host;!$err) -and 
$(command -arg1 -ev err | Out-Host;!$err)

Это вроде как все равно не работает. Возможно, что-то вроде этого было бы лучше:

function ExecuteUntilError([scriptblock[]]$Scriptblock)
{
    foreach ($sb in $scriptblock)
    {
        $prevErr = $error[0]
        . $sb
        if ($error[0] -ne $prevErr) { break }
    }
}

ExecuteUntilError {command -arg1 -arg2},{command2-arg1}
28
ответ дан 27 November 2019 в 22:43
поделиться

Предварительный просмотр Powershell 7 5 имеет их. Я не знаю, почему это было удалено без уведомления или объяснения. https://devblogs.microsoft.com/powershell/powershell-7-preview-5 / Это даст вывод обеих команд как вопрос, который требуют.

echo 'hello' && echo 'there'
hello
there

echo 'hello' || echo 'there'
hello
0
ответ дан 27 November 2019 в 22:43
поделиться
Другие вопросы по тегам:

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