Как запустить скрипт PowerShell в пакетном файле Windows

Как мне встраивали сценарий PowerShell в том же файле как сценарий пакетной обработки Windows?

Я знаю, что такого рода вещь возможна в других сценариях:

  • Встраивание SQL в использовании сценария пакетной обработки sqlcmd и умные расположения goto's и комментарии в начале файла
  • В *отклоняют среду, имеющую название программы, с которой Вы хотите запустить скрипт на первой строке прокомментированного сценария, например, #!/usr/local/bin/python.

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

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

Я имею некоторые необычные ограничения и хотел бы найти изящное решение. Я подозреваю, что этот вопрос может травить ответы разнообразия: "Почему не делают Вы пытаетесь решить эту другую проблему вместо этого". Будьте достаточны, чтобы сказать, что это мои ограничения, извините об этом.

Какие-либо идеи? Существует ли подходящая комбинация умных комментариев и символов ESC, которые позволят мне достигнуть этого?

Некоторые мысли о том, как достигнуть этого:

  • Карат ^ в конце строки продолжение - как подчеркивание в Visual Basic
  • Амперсанд & обычно используется для разделения команд echo Hello & echo World результаты в двух echos на отдельных строках
  • %0 даст Вам скрипт, который это в настоящее время запускает

Таким образом, что-то вроде этого (если бы я мог бы заставить его работать) было бы хорошо:

# & call powershell -psconsolefile %0
# & goto :EOF
/* From here on in we're running nice juicy powershell code */
Write-Output "Hello World"

Кроме...

  • Это не работает... потому что
  • расширение файла не согласно симпатии PowerShell: Windows PowerShell console file "insideout.bat" extension is not psc1. Windows PowerShell console file extension must be psc1.
  • CMD не действительно в целом доволен ситуацией ни один - хотя это действительно натыкается на '#', it is not recognized as an internal or external command, operable program or batch file.

19
задан Ross Ridge 6 January 2017 в 03:25
поделиться

4 ответа

Это передает только правильные строки в PowerShell:

dosps2.cmd :

@findstr/v "^@f.*&" "%~f0"|powershell -&goto:eof
Write-Output "Hello World" 
Write-Output "Hello some@com & again" 

Регулярное выражение исключает строки, начинающиеся с @f , включая и , а все остальное передает в PowerShell.

C:\tmp>dosps2
Hello World
Hello some@com & again
18
ответ дан 30 November 2019 в 03:07
поделиться

Кажется, это работает, если вы не возражаете против одной ошибки в PowerShell в начале:

dosps.cmd :

@powershell -<%~f0&goto:eof
Write-Output "Hello World" 
Write-Output "Hello World again" 
3
ответ дан 30 November 2019 в 03:07
поделиться

Похоже, вы ищете то, что иногда называют "полиглотским скриптом". Для CMD -> PowerShell,

@@:: This prolog allows a PowerShell script to be embedded in a .CMD file.
@@:: Any non-PowerShell content must be preceeded by "@@"
@@setlocal
@@set POWERSHELL_BAT_ARGS=%*
@@if defined POWERSHELL_BAT_ARGS set POWERSHELL_BAT_ARGS=%POWERSHELL_BAT_ARGS:"=\"%
@@PowerShell -Command Invoke-Expression $('$args=@(^&{$args} %POWERSHELL_BAT_ARGS%);'+[String]::Join([char]10,$((Get-Content '%~f0') -notmatch '^^@@'))) & goto :EOF

Если вам не нужно поддерживать цитируемые аргументы, вы можете даже сделать это однострочным:

@PowerShell -Command Invoke-Expression $('$args=@(^&{$args} %*);'+[String]::Join([char]10,(Get-Content '%~f0') -notmatch '^^@PowerShell.*EOF$')) & goto :EOF

Взято из http://blogs.msdn.com/jaybaz_ms/archive/2007/04/26/powershell-polyglot.aspx. Это был PowerShell v1; возможно, в v2 все проще, но я не смотрел.

12
ответ дан 30 November 2019 в 03:07
поделиться

Без полного понимания вашего вопроса я предлагаю примерно следующее:

@echo off
set MYSCRIPT="some cool powershell code"
powershell -c %MYSCRIPT%

или еще лучше

@echo off
set MYSCRIPTPATH=c:\work\bin\powershellscript.ps1
powershell %MYSCRIPTPATH%
1
ответ дан 30 November 2019 в 03:07
поделиться
Другие вопросы по тегам:

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