У меня есть пакетный сценарий, который открывает сеанс 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.
@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», потому что это пустая строка.
Многие ошибки, похоже, связаны с кодом PS. Не то, чтобы код PS был неверным, скорее, установленные правила обработки аргументов несовместимы между отправителем (пакетный файл) и получателем (PS). Возможно, я мог бы помочь еще больше, если бы был минимальный код PS с разделом параметров PS и входными данными, которые вызывают у вас проблемы. Может работать лучше, если передаваемые аргументы пакетного файла добавляются к переменной перед передачей в скрипт PS, чтобы ''
аргументы не передавались. Это предположение, и, не зная и не проверив, что требует PS, я могу предположить, что оно неверно.
Ведущий
.\
так же важен в Powershell, как и в Bash. Без этого вы не получаете доступ к файлу в текущем каталоге.