GUI 지원으로 Ingo Karstein의 훌륭한 스크립트를 과도하게 작업했습니다. GUI 출력 및 입력은 하나의 스위치로 활성화되며 실제 Windows 실행 파일이 생성됩니다. Powershell 5.x에서만 컴파일됩니다. 옵션 그래픽 프런트 엔드 Win-PS2EXE 포함.
모듈 버전.
스크립트 기반 버전은 여기(https://github.com/MScholtes/TechNet-Gallery)에서 찾을 수 있습니다.
저자: 마르쿠스 숄테스
버전: 1.0.14
날짜: 2024-09-15
PS C: > Install-Module ps2exe
또는 여기에서 다운로드하세요: https://www.powershellgallery.com/packages/ps2exe/.
Invoke-ps2exe .source.ps1 . target.exe
또는
ps2exe .source.ps1 . target.exe
"source.ps1"을 실행 가능한 target.exe로 컴파일합니다(".target.exe"를 생략하면 출력이 ".source.exe"에 기록됩니다).
또는 그래픽 프런트 엔드를 위해 Win-PS2EXE를 시작하십시오.
Win - PS2EXE
ps2exe [ - inputFile ] ' ' [[ - outputFile ] ' ' ]
[ - prepareDebug ] [ - x86 | - x64 ] [ - lcid < id > ] [ - STA | - MTA ] [ - noConsole ] [ - UNICODEEncoding ]
[ - credentialGUI ] [ - iconFile ' ' ] [ - title ' ' ] [ - description ' ' ]
[ - company ' ' ] [ - product ' ' ] [ - copyright ' ' ] [ - trademark ' ' ]
[ - version ' ' ] [ - configFile ] [ - noOutput ] [ - noError ] [ - noVisualStyles ] [ - exitOnCancel ]
[ - DPIAware ] [ - requireAdmin ] [ - supportOS ] [ - virtualize ] [ - longPaths ]
inputFile = Powershell script that you want to convert to executable (file has to be UTF8 or UTF16 encoded)
outputFile = destination executable file name or folder, defaults to inputFile with extension '.exe'
prepareDebug = create helpful information for debugging
x86 or x64 = compile for 32-bit or 64-bit runtime only
lcid = location ID for the compiled executable. Current user culture if not specified
STA or MTA = 'Single Thread Apartment' or 'Multi Thread Apartment' mode
noConsole = the resulting executable will be a Windows Forms app without a console window
UNICODEEncoding = encode output as UNICODE in console mode
credentialGUI = use GUI for prompting credentials in console mode
iconFile = icon file name for the compiled executable
title = title information (displayed in details tab of Windows Explorer's properties dialog)
description = description information (not displayed, but embedded in executable)
company = company information (not displayed, but embedded in executable)
product = product information (displayed in details tab of Windows Explorer's properties dialog)
copyright = copyright information (displayed in details tab of Windows Explorer's properties dialog)
trademark = trademark information (displayed in details tab of Windows Explorer's properties dialog)
version = version information (displayed in details tab of Windows Explorer's properties dialog)
configFile = write config file (.exe.config)
noOutput = the resulting executable will generate no standard output (includes verbose and information channel)
noError = the resulting executable will generate no error output (includes warning and debug channel)
noVisualStyles = disable visual styles for a generated windows GUI application (only with -noConsole)
exitOnCancel = exits program when Cancel or "X" is selected in a Read-Host input box (only with -noConsole)
DPIAware = if display scaling is activated, GUI controls will be scaled if possible (only with -noConsole)
requireAdmin = if UAC is enabled, compiled executable run only in elevated context (UAC dialog appears if required)
supportOS = use functions of newest Windows versions (execute [Environment]::OSVersion to see the difference)
virtualize = application virtualization is activated (forcing x86 runtime)
longPaths = enable long paths ( > 260 characters) if enabled on OS (works only with Windows 10)
생성된 실행 파일에는 다음과 같은 예약된 매개변수가 있습니다.
-? [] Powershell help text of the script inside the executable. The optional parameter combination
"-? -detailed", "-? -examples" or "-? -full" can be used to get the appropriate help text.
-debug Forces the executable to be debugged. It calls "System.Diagnostics.Debugger.Launch()".
-extract: Extracts the powerShell script inside the executable and saves it as FILENAME.
The script will not be executed.
-wait At the end of the script execution it writes "Hit any key to exit..." and waits for a key to be pressed.
-end All following options will be passed to the script inside the executable.
All preceding options are used by the executable itself and will not be passed to the script.
PS2EXE용 기본 입출력 명령은 C#으로 다시 작성해야 했습니다. 콘솔 모드의 쓰기 진행 (작업량이 너무 많음) 및 기록 시작 / 기록 중지 (Microsoft의 적절한 참조 구현 없음)는 구현되지 않았습니다.
기본적으로 commandlet의 powershell 출력은 한 줄당(문자열 배열) 형식으로 지정됩니다. 명령이 10줄의 출력을 생성하고 GUI 출력을 사용하면 각각 확인을 기다리는 10개의 메시지 상자가 나타납니다. 이 파이프를 방지하려면 명령을 Comandlet Out-String으로 파이프하십시오. 그러면 출력이 10개 라인이 포함된 하나의 문자열 배열로 변환되고, 모든 출력은 하나의 메시지 상자에 표시됩니다(예: dir C: | Out-String).
PS2EXE는 생성된 실행 파일 이름 + ".config"를 사용하여 구성 파일을 생성할 수 있습니다. 대부분의 경우 이러한 구성 파일은 필요하지 않으며 사용해야 하는 .Net Framework 버전을 알려주는 매니페스트입니다. 일반적으로 실제 .Net Framework를 사용하므로 구성 파일 없이 실행 파일을 실행해 보세요.
컴파일된 스크립트는 원본 스크립트와 마찬가지로 매개변수를 처리합니다. 한 가지 제한 사항은 Windows 환경에서 발생합니다. 모든 실행 파일의 경우 모든 매개 변수는 STRING 유형을 가지며, 매개 변수 유형에 대한 암시적 변환이 없으면 스크립트에서 명시적으로 변환해야 합니다. 동일한 제한을 적용하여 콘텐츠를 실행 파일로 파이프할 수도 있습니다(파이핑된 모든 값의 유형은 STRING임).
컴파일된 스크립트에 비밀번호를 저장하지 마세요! -extract 매개변수를 사용하여 스크립트를 간단히 디컴파일할 수 있습니다. 예를 들어
Output.exe - extract:C:Output.ps1
Output.exe에 저장된 스크립트를 디컴파일합니다.
PS2EXE는 스크립트를 실행 파일로 변환하므로 스크립트 관련 변수를 더 이상 사용할 수 없습니다. 특히 $PSScriptRoot 변수는 비어 있습니다.
$MyInvocation 변수는 스크립트가 아닌 다른 값으로 설정됩니다.
다음 코드를 사용하여 컴파일/컴파일되지 않은 스크립트/실행 가능 경로를 검색할 수 있습니다(JacquesFS 덕분에).
if ( $MyInvocation .MyCommand.CommandType -eq " ExternalScript " )
{ $ScriptPath = Split-Path - Parent - Path $MyInvocation .MyCommand.Definition }
else
{ $ScriptPath = Split-Path - Parent - Path ([ Environment ]::GetCommandLineArgs()[ 0 ])
if ( ! $ScriptPath ){ $ScriptPath = " . " } }
-noConsole 모드를 사용하여 스크립트에서 외부 창이 열리면(예: Get-Credential 또는 cmd.exe 셸이 필요한 명령의 경우) 다음 창이 백그라운드에서 열립니다.
그 이유는 외부 창을 닫을 때 창이 상위 창을 활성화하려고 하기 때문입니다. 컴파일된 스크립트에는 창이 없기 때문에 컴파일된 스크립트의 상위 창(일반적으로 Explorer 또는 Powershell의 창)이 대신 활성화됩니다.
이 문제를 해결하려면 $Host.UI.RawUI.FlushInputBuffer()가 활성화될 수 있는 보이지 않는 창을 엽니다. 다음 $Host.UI.RawUI.FlushInputBuffer() 호출은 이 창을 닫습니다.
다음 예에서는 "ipconfig | Out-String"을 한 번 호출해도 더 이상 백그라운드에서 창이 열리지 않습니다.
$Host .UI.RawUI.FlushInputBuffer ()
ipconfig | Out-String
$Host .UI.RawUI.FlushInputBuffer ()
git diff를 허용하기 위해 파일을 UTF-16에서 UTF-8로 변환했습니다.
콘솔 모드에서 보안 문자열 요청의 제어 키를 무시합니다.