Как мне встраивали сценарий PowerShell в том же файле как сценарий пакетной обработки Windows?
Я знаю, что такого рода вещь возможна в других сценариях:
sqlcmd
и умные расположения goto's и комментарии в начале файла#!/usr/local/bin/python
.Не может быть способа сделать это - в этом случае я должен буду назвать отдельный сценарий PowerShell из запускающегося сценария.
Одно возможное решение, которое я рассмотрел, состоит в том, чтобы повторить сценарий PowerShell и затем выполнить его. Серьезное основание не сделать это - то, что часть причины делать попытку этого должна использовать преимущества среды PowerShell без боли, например, символы ESC
Я имею некоторые необычные ограничения и хотел бы найти изящное решение. Я подозреваю, что этот вопрос может травить ответы разнообразия: "Почему не делают Вы пытаетесь решить эту другую проблему вместо этого". Будьте достаточны, чтобы сказать, что это мои ограничения, извините об этом.
Какие-либо идеи? Существует ли подходящая комбинация умных комментариев и символов ESC, которые позволят мне достигнуть этого?
Некоторые мысли о том, как достигнуть этого:
^
в конце строки продолжение - как подчеркивание в Visual Basic&
обычно используется для разделения команд echo Hello & echo World
результаты в двух echos на отдельных строкахТаким образом, что-то вроде этого (если бы я мог бы заставить его работать) было бы хорошо:
# & call powershell -psconsolefile %0
# & goto :EOF
/* From here on in we're running nice juicy powershell code */
Write-Output "Hello World"
Кроме...
Windows PowerShell console file "insideout.bat" extension is not psc1. Windows PowerShell console file extension must be psc1.
'#', it is not recognized as an internal or external command, operable program or batch file.
Это передает только правильные строки в 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
Кажется, это работает, если вы не возражаете против одной ошибки в PowerShell в начале:
dosps.cmd
:
@powershell -<%~f0&goto:eof
Write-Output "Hello World"
Write-Output "Hello World again"
Похоже, вы ищете то, что иногда называют "полиглотским скриптом". Для 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 все проще, но я не смотрел.
Без полного понимания вашего вопроса я предлагаю примерно следующее:
@echo off
set MYSCRIPT="some cool powershell code"
powershell -c %MYSCRIPT%
или еще лучше
@echo off
set MYSCRIPTPATH=c:\work\bin\powershellscript.ps1
powershell %MYSCRIPTPATH%