Как я могу показать вывод $(команды), который вызывается внутри сценария .ps1

В настоящее время я пытаюсь использовать сценарий PowerShell для автоматизации ежедневного обслуживания моих приложений.

Итак, у меня внутри есть что-то похожее на этот псевдокод:

statement
statement
$variable
$(command $variable) #edited
# this is external .bat file that I'm passing the variable as param.
statement

Дело в том, что подкоманда выполняется, но не передает свой вывод в main thread, поэтому я получаю «паузу», пока она выполняется.

normal output
normal output
**wait while subcommand gets executed**
normal output

Как я могу записать вывод подкоманды в основной стандартный вывод моего скрипта?

Я немного исследовал, и появился Tee-Object, но я думаю, что он в основном предназначен для одновременной записи файла, пока вы показываете свою вещь через стандартный вывод, что полезно для целей регистрации и, возможно, понадобится в будущем.

В моем конкретном случае я сейчас не знаю, можно ли использовать Tee-Object.

Спасибо. Также обратите внимание, что вы можете помочь будущим читателям, четко обозначив, какой ответ, если таковой имеется, решил вашу проблему, а именно приняв его.

mklement0 22.08.2024 23:37
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
55
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Судя по тому, как вы написали свой псевдоскрипт, $(command) является параметром третьего statement. Либо statement должен вывести все, что он получает в качестве первого параметра, либо вы должны отдельно учесть необходимость печати выходных данных.

Чтобы сделать последнее, присвойте его переменной, напечатайте переменную, а затем передайте ее в качестве параметра в statement:

statement1
statement2
$s3param = $(command)   # capture the output of command
$s3param                # print the (captured) output of command
statement3 $s3param     # pass the (captured) output of command as a parameter to statement3
statement4
⋮

(В зависимости от command вам может не понадобиться $() вокруг него)

Джефф, ты совершенно прав. Моя подкоманда не является параметром, передаваемым в оператор, это сам по себе оператор, но он действительно должен находиться внутри $(), поскольку для вызова требуется внешний .bat.

arendon 22.08.2024 19:22

Предисловие:

  • Ответ ниже, а также Джеффа Зейтлина основаны на более ранней форме вопроса со случайно другой предпосылкой:

    • Как также распечатать/отправить в поток вывода успеха вывод команды, которая передается другой команде в качестве аргумента, заключенного в $(...)
      (command $(command)), в идеале в потоковом режиме (испуская каждый выходной объект, как только он становится доступным).
  • Чтобы обратиться к текущей форме вопроса:


Ответ на исходный вопрос:

Полезный ответ Джеффа Зейтлина показывает, как сначала захватить весь вывод команды внутри $(...), затем вывести его в поток вывода успеха (аналог стандартного вывода PowerShell) и, наконец, передать его в качестве аргумента, как и раньше.

Альтернативно, ЕСЛИ:

  • Ваше намерение состоит в том, чтобы передать поток вывода, созданного командой внутри $(...), как только будет создан каждый выходной объект, и...
  • ... достаточно производить только вывод на дисплей (терминал), и...
  • ... при условии, что вы используете PowerShell (Core) 7 (см. этот ответ, чтобы узнать обходной путь для Windows PowerShell),

вы можете использовать Tee-Object и передать консоль/терминальное устройство в качестве аргумента параметра -FilePath, который затем выводит каждый входной объект на терминал, а также выводит его в поток вывода успеха для дальнейшей программной обработки:

Вот простой пример:

# PowerShell 7
Write-Host -ForegroundColor Yellow $(
  1, 2, 3 | Tee-Object -FilePath ($IsWindows ? '\\.\CON': '/dev/tty')
)

Пример команды (массив 1, 2, 3) выводится на терминал в потоковом режиме, прежде чем Write-Host сразу получает собранные выходные данные в виде одного аргумента.

Обратите внимание, что, как отмечает Джефф, использование $(...) может не потребоваться для заключения вашей команды, что позволяет вместо этого использовать более эффективный и не имеющий побочных эффектов (...); действительно, в рассматриваемом случае, поскольку команда состоит только из одного конвейера, (...) достаточно - см. этот ответ для получения дополнительной информации.

Огромное спасибо, действительно, решение моей глупой проблемы заключалось в использовании структуры & {} вместо $( ). Огромное спасибо за ваше время и терпение.

arendon 28.08.2024 16:32
Ответ принят как подходящий

Если я понимаю вопрос, без какого-либо кода вы хотите использовать & { } (или функцию) вместо $( ), чтобы увидеть результат в реальном времени? (Но зачем вообще использовать $( ), если вы не хотите объединить несколько операторов?)

$(1;sleep 1;2;sleep 1;3)  # dumps output all at once at the end
1
2
3

& {1;sleep 1;2;sleep 1;3}  # see output as it's running
1
2
3

Другие вопросы по теме

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

Как получить значение роли приложения с учетом идентификатора роли приложения в Entra ID с помощью Microsoft Graph Powershell?
Как получить список конвейеров в фабрике данных Azure для определенной ветки?
Доступ к параметрам приложения логики в коде сценария PowerShell в стандартных рабочих процессах
Использование API NDepend из сценария Windows PowerShell 5.1 приводит к ошибке регистра букв CLS
Перемещение изображений в подпапках в зависимости от ориентации
Как запросить разрешения OAuth2 для субъектов службы в Entra ID с помощью Microsoft Graph Powershell?
Невозможно обновить переменные в сценарии PowerShell файла yml Azure Devops
Отсутствует терминатор в PowerShell CLI в цикле for с использованием расширенных переменных
Как получить доступ к защищенной переменной в свойстве условия задачи Powershell в конвейере Azure
Powershell, как отображать только имена каталогов (кроме одного) и подкаталогов?