Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision | |||
ms_windows_ms_sql:bat_and_powershell_to_exe [2019/10/31 12:39] – [Скрываем окно любого процесса средствами Powershell] admin | ms_windows_ms_sql:bat_and_powershell_to_exe [2019/11/06 14:04] (current) – admin | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Задача ====== | ||
+ | У меня есть скрипт на **Powershell**. Мне нужно сделать из него исполняемый файл. Желательно - встроенными средствами **Windows** (10/2016). \\ | ||
+ | \\ | ||
+ | Так как я давно знаю о существовании **bat2exe**, | ||
+ | * встроить многострочный скрипт **Powershell** в bat-скрипт | ||
+ | * конвертировать полученный **bat**-скрипт в исполняемый **exe**-файл | ||
+ | ===== Встроить PowerShell-скрипт в bat-скрипт ===== | ||
+ | https:// | ||
+ | Оказалось все несложно при соблюдении некоторых условностей. \\ | ||
+ | Для исполнения многострочной команды **powershell** внутри **bat**-скрипта нужно делать так: | ||
+ | < | ||
+ | for ($i=1; $i -lt 10; $i++){^ | ||
+ | |||
+ | | ||
+ | |||
+ | Write-Host | ||
+ | </ | ||
+ | Это **bat**-скрипт, | ||
+ | На что обратить внимание: | ||
+ | - Строки, | ||
+ | - Между строками - пустые строки. Без них команды **powershell** склеются в одну длинную строку, | ||
+ | - Экранирование символов. В данном случае экранированы двойные кавычки **"**. Это нужно не всегда, | ||
+ | - Не стоит оставлять фигурные скобки в одиночестве на строке. | ||
+ | |||
+ | Вот однострочник **bash**, который берет заданный Powershell-скрипт и выводит соответствующий ему bat-скрипт: | ||
+ | echo -e " | ||
+ | Вот более сложный скрипт, | ||
+ | < | ||
+ | |||
+ | $UbuntuAppxPackagename=' | ||
+ | |||
+ | $ubuntu_exe=' | ||
+ | |||
+ | $ubuntu_exe=\" | ||
+ | |||
+ | $username=$(whoami / | ||
+ | |||
+ | $XServerProcessName=' | ||
+ | |||
+ | $XServerExePath=' | ||
+ | |||
+ | $XServerArguments=': | ||
+ | |||
+ | $cmd = ' | ||
+ | |||
+ | cmd /c $cmd^ | ||
+ | |||
+ | if ($(Get-Process -Name $XServerProcessName) -eq $null) { Start-Process -NoNewWindow -FilePath $XServerExePath -ArgumentList $XServerArguments }^ | ||
+ | |||
+ | $cmd = ' | ||
+ | |||
+ | cmd /c $cmd</ | ||
+ | |||
+ | ===== Конвертирование bat в exe с помощью встронных средств Windows ===== | ||
+ | https:// | ||
+ | https:// | ||
+ | \\ | ||
+ | Это вообще похоже на магию. \\ | ||
+ | Есть такая утилита **IEXPRESS**. Она есть во всех версиях Windows, начиная с Windows 2000 и предназначена для создания самораспаковывающихся архивов из набора файлов. \\ | ||
+ | Вот **bat**-файл, | ||
+ | Пользоваться им очень просто - создаем файл с этим скриптом и перетаскиваем на его иконку **bat**-скрипт, | ||
+ | < | ||
+ | ;Title Converting batch scripts to file.exe with iexpress | ||
+ | ;Mode 75,3 & color 0A | ||
+ | ;Rem Original Script https:// | ||
+ | ;echo( | ||
+ | ;if " | ||
+ | ;echo Usage : Drag and Drop your batch file over this script:" | ||
+ | ;Timeout /T 5 / | ||
+ | ;) | ||
+ | ;set " | ||
+ | ;set " | ||
+ | ;set " | ||
+ | ;set " | ||
+ | ;Set " | ||
+ | ;echo Please | ||
+ | ;copy /y " | ||
+ | ;( | ||
+ | ;(echo() | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | |||
+ | ;iexpress /n /q /m %sed% | ||
+ | ;del /q /f " | ||
+ | ;exit /b 0 | ||
+ | |||
+ | [Version] | ||
+ | Class=IEXPRESS | ||
+ | SEDVersion=3 | ||
+ | [Options] | ||
+ | PackagePurpose=InstallApp | ||
+ | ShowInstallProgramWindow=0 | ||
+ | HideExtractAnimation=1 | ||
+ | UseLongFileName=1 | ||
+ | InsideCompressed=0 | ||
+ | CAB_FixedSize=0 | ||
+ | CAB_ResvCodeSigning=0 | ||
+ | RebootMode=N | ||
+ | InstallPrompt=%InstallPrompt% | ||
+ | DisplayLicense=%DisplayLicense% | ||
+ | FinishMessage=%FinishMessage% | ||
+ | TargetName=%TargetName% | ||
+ | FriendlyName=%FriendlyName% | ||
+ | AppLaunched=%AppLaunched% | ||
+ | PostInstallCmd=%PostInstallCmd% | ||
+ | AdminQuietInstCmd=%AdminQuietInstCmd% | ||
+ | UserQuietInstCmd=%UserQuietInstCmd% | ||
+ | SourceFiles=SourceFiles | ||
+ | |||
+ | [Strings] | ||
+ | InstallPrompt= | ||
+ | DisplayLicense= | ||
+ | FinishMessage= | ||
+ | FriendlyName=- | ||
+ | PostInstallCmd=< | ||
+ | AdminQuietInstCmd=</ | ||
+ | |||
+ | Единственным недостатком этого метода можно считать открытое окно консоли на фоне. | ||
+ | |||
+ | ====== Скрываем окно любого процесса средствами Powershell ====== | ||
+ | https:// | ||
+ | Нижеприведенный powershell-код позволяет скрыть окно любого процесса: | ||
+ | < | ||
+ | { | ||
+ | Hide = 0 | ||
+ | Normal = 1 | ||
+ | Minimized = 2 | ||
+ | Maximized = 3 | ||
+ | ShowNoActivateRecentPosition = 4 | ||
+ | Show = 5 | ||
+ | MinimizeActivateNext = 6 | ||
+ | MinimizeNoActivate = 7 | ||
+ | ShowNoActivate = 8 | ||
+ | Restore = 9 | ||
+ | ShowDefault = 10 | ||
+ | ForceMinimize = 11 | ||
+ | } | ||
+ | |||
+ | |||
+ | # the C#-style signature of an API function (see also www.pinvoke.net) | ||
+ | $code = ' | ||
+ | |||
+ | # add signature as new type to PowerShell (for this session) | ||
+ | $type = Add-Type -MemberDefinition $code -Name myAPI -PassThru | ||
+ | |||
+ | # access a process | ||
+ | # (in this example, we are accessing the current PowerShell host | ||
+ | # with its process ID being present in $pid, but you can use | ||
+ | # any process ID instead) | ||
+ | $process = Get-Process -Id $PID | ||
+ | |||
+ | # get the process window handle | ||
+ | $hwnd = $process.MainWindowHandle | ||
+ | |||
+ | # apply a new window size to the handle, i.e. hide the window completely | ||
+ | $type:: | ||
+ | |||
+ | Start-Sleep -Seconds 2 | ||
+ | # restore the window handle again | ||
+ | $type:: | ||
+ | |||
+ | Чтобы работало в старых версиях **Powershell** (2-4) определение типов видимости нужно делать так: | ||
+ | < | ||
+ | public enum ShowStates | ||
+ | { | ||
+ | Hide = 0, | ||
+ | Normal = 1, | ||
+ | Minimized = 2, | ||
+ | Maximized = 3, | ||
+ | ShowNoActivateRecentPosition = 4, | ||
+ | Show = 5, | ||
+ | MinimizeActivateNext = 6, | ||
+ | MinimizeNoActivate = 7, | ||
+ | ShowNoActivate = 8, | ||
+ | Restore = 9, | ||
+ | ShowDefault = 10, | ||
+ | ForceMinimize = 11, | ||
+ | } | ||
+ | '</ | ||
+ | |||
+ | Вот bat-скрипт, | ||
+ | < | ||
+ | |||
+ | Enum ShowStates {^ | ||
+ | |||
+ | Hide = 0^ | ||
+ | |||
+ | Normal = 1^ | ||
+ | |||
+ | Minimized = 2^ | ||
+ | |||
+ | Maximized = 3^ | ||
+ | |||
+ | ShowNoActivateRecentPosition = 4^ | ||
+ | |||
+ | Show = 5^ | ||
+ | |||
+ | MinimizeActivateNext = 6^ | ||
+ | |||
+ | MinimizeNoActivate = 7^ | ||
+ | |||
+ | ShowNoActivate = 8^ | ||
+ | |||
+ | Restore = 9^ | ||
+ | |||
+ | ShowDefault = 10^ | ||
+ | |||
+ | ForceMinimize = 11 } ^ | ||
+ | |||
+ | $code = ' | ||
+ | |||
+ | $type = Add-Type -MemberDefinition $code -Name myAPI -PassThru ^ | ||
+ | |||
+ | $ParentProcessId = $(Get-CimInstance Win32_Process -Filter \" | ||
+ | |||
+ | $process = Get-Process -Id $ParentProcessId^ | ||
+ | |||
+ | $hwnd = $process.MainWindowHandle^ | ||
+ | |||
+ | $type:: | ||
+ | |||
+ | ############################################################# | ||
+ | |||
+ | $UbuntuAppxPackagename=\" | ||
+ | |||
+ | $ubuntu_exe=\" | ||
+ | |||
+ | $username=$(whoami / | ||
+ | |||
+ | $XServerProcessName=' | ||
+ | |||
+ | $XServerExePath=' | ||
+ | |||
+ | $XServerArguments=': | ||
+ | |||
+ | $cmd = ' | ||
+ | |||
+ | cmd /c $cmd^ | ||
+ | |||
+ | if ($(Get-Process -Name $XServerProcessName) -eq $null) { Start-Process -NoNewWindow -FilePath $XServerExePath -ArgumentList $XServerArguments }^ | ||
+ | |||
+ | $cmd = ' | ||
+ | |||
+ | cmd /c $cmd | ||
+ | |||
+ | </ |