Почему большая часть вывода не перенаправляется в файл?

У меня есть пакетный сценарий, который открывает сеанс PS в качестве политики обхода и выполняет все, что необходимо выполнить сценарию PS.

set "psFile=.\main.ps1"

Powershell.exe -ExecutionPolicy ByPass -Command "&{%psFile% %2 %3 %4 %5 %6 | Tee-Object -FilePath log.txt}"

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

Почему это?

Кроме того, еще одна вещь, я хотел бы использовать этот bat-файл для любого PS-скрипта, поэтому я попытался сделать что-то вроде этого:

set psFile = "%1"

Powershell.exe -ExecutionPolicy ByPass -Command "&{%psFile% %2 %3 %4 %5 %6 | Tee-Object -FilePath log.txt}"

и когда я открываю CMD и набираю следующее:

runPS.bat main.ps1 DB1

он жалуется:

The term 'main.ps1' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

Ведущий .\ так же важен в Powershell, как и в Bash. Без этого вы не получаете доступ к файлу в текущем каталоге.

michael_heath 28.05.2019 06:22
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
120
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
@echo off
setlocal

rem Get fullpath of 1st argument.
for %%A in ("%~1") do set "psfile=%%~fA"

rem Save log in same directory of 1st argument.
set "logfile=%~dp1log.txt"

if defined psfile (
    rem Run the PS1 file with remaining arguments and tee the piped stdout stream.
    Powershell.exe -ExecutionPolicy ByPass -Command "&{&'%psFile%' '%~2' '%~3' '%~4' '%~5' '%~6' | Tee-Object -FilePath '%logfile%'}"
)

Цикл for получит полный путь 1-го аргумента если не был пройден полный путь.

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

Одинарные кавычки, окружающие пути, помогают с любым возможные пробелы и т.д.

Протестировано с PS1 для отображения переданных аргументов:

$args

который, кажется, показывает, что все stdout в порядке с тестом.

Чтобы включить другие потоки, просмотрите О перенаправлении.

Хорошо, я думаю, что он, по крайней мере, распознает файл ps, однако аргумент% ~ 2 не принимает ввод параметров в сценарий ps. это дает мне ошибку: сценарий PS должен запрашивать у меня ввод (который будет передан в аргумент% 2, но вместо этого он выдает ошибку. если я попытаюсь передать его по команде как таковой: runPS.bat main.ps1 DB1 .... жалуется: невозможно найти позиционный параметр, который принимает аргумент.) если я не передам аргумент (например, DB1), он соответствует: невозможно связать аргумент с параметром «DB_input», потому что это пустая строка.

Cataster 28.05.2019 17:45

Многие ошибки, похоже, связаны с кодом PS. Не то, чтобы код PS был неверным, скорее, установленные правила обработки аргументов несовместимы между отправителем (пакетный файл) и получателем (PS). Возможно, я мог бы помочь еще больше, если бы был минимальный код PS с разделом параметров PS и входными данными, которые вызывают у вас проблемы. Может работать лучше, если передаваемые аргументы пакетного файла добавляются к переменной перед передачей в скрипт PS, чтобы '' аргументы не передавались. Это предположение, и, не зная и не проверив, что требует PS, я могу предположить, что оно неверно.

michael_heath 29.05.2019 02:32

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