
PowerShell 스크립트를 실행 파일로 컴파일하는 모듈
Ingo Karstein의 훌륭한 스크립트를 개선한 GUI 지원 버전입니다. GUI 출력 및 입력은 하나의 스위치로 활성화되며, 실제 Windows 실행 파일이 생성됩니다. Powershell 5.x 호환 스크립트만 컴파일합니다. 선택적 그래픽 프론트엔드 Win-PS2EXE가 포함되어 있습니다.
모듈 버전입니다.
스크립트 기반 버전은 여기에서 찾을 수 있습니다 (https://github.com/MScholtes/TechNet-Gallery).
저자: Markus Scholtes
버전: 1.0.18
날짜: 2026-06-06
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] '<file_name>' [[-outputFile] '<file_name>']
[-prepareDebug] [-x86|-x64] [-lcid <id>] [-STA|-MTA] [-noConsole] [-conHost] [-UNICODEEncoding]
[-credentialGUI] [-iconFile '<filename>'] [-$embedFiles <hashtable>] [-title '<title>'] [-description '<description>']
[-company '<company>'] [-product '<product>'] [-copyright '<copyright>'] [-trademark '<trademark>']
[-version '<version>'] [-configFile] [-noOutput] [-noError] [-noVisualStyles] [-exitOnCancel]
[-DPIAware] [-requireAdmin] [-supportOS] [-virtualize] [-longPaths]
inputFile = 실행 파일로 변환할 Powershell 스크립트 (파일은 UTF8 또는 UTF16으로 인코딩되어야 함)
outputFile = 대상 실행 파일 이름 또는 폴더, 기본값은 확장자가 '.exe'인 inputFile
prepareDebug = 디버깅을 위한 유용한 정보 생성
x86 or x64 = 32비트 또는 64비트 런타임 전용으로 컴파일
lcid = 컴파일된 실행 파일의 로캘 ID. 지정하지 않으면 현재 사용자 문화권
STA or MTA = '단일 스레드 아파트' 또는 '다중 스레드 아파트' 모드
noConsole = 결과 실행 파일이 콘솔 창 없이 Windows Forms 앱이 됨
conHost = Windows Terminal 대신 conhost를 콘솔로 강제 시작 (리디렉션 비활성화)
UNICODEEncoding = 콘솔 모드에서 출력을 UNICODE로 인코딩
credentialGUI = 콘솔 모드에서 자격 증명 프롬프트에 GUI 사용
iconFile = 컴파일된 실행 파일의 아이콘 파일 이름
embedFiles = 해시로 제공된 임베드할 파일, 해시의 키로 추출됨, 소스 파일 이름은 고유해야 함
(예: -embedFiles @{'Targetfilepath'='Sourcefilepath'} )
title = 제목 정보 (Windows 탐색기 속성 대화상자의 세부 정보 탭에 표시됨)
description = 설명 정보 (표시되지 않지만 실행 파일에 포함됨)
company = 회사 정보 (표시되지 않지만 실행 파일에 포함됨)
product = 제품 정보 (Windows 탐색기 속성 대화상자의 세부 정보 탭에 표시됨)
copyright = 저작권 정보 (Windows 탐색기 속성 대화상자의 세부 정보 탭에 표시됨)
trademark = 상표 정보 (Windows 탐색기 속성 대화상자의 세부 정보 탭에 표시됨)
version = 버전 정보 (Windows 탐색기 속성 대화상자의 세부 정보 탭에 표시됨)
configFile = 구성 파일 작성 (<outputfile>.exe.config)
noOutput = 결과 실행 파일이 표준 출력을 생성하지 않음 (자세한 정보 및 정보 채널 포함)
noError = 결과 실행 파일이 오류 출력을 생성하지 않음 (경고 및 디버그 채널 포함)
noVisualStyles = 생성된 Windows GUI 응용 프로그램에 대한 비주얼 스타일 비활성화 (-noConsole과 함께만)
exitOnCancel = Read-Host 입력 상자에서 취소 또는 "X"를 선택하면 프로그램 종료 (-noConsole과 함께만)
DPIAware = 디스플레이 배율이 활성화된 경우 가능하면 GUI 컨트롤 배율 조정 (-noConsole과 함께만)
requireAdmin = UAC가 활성화된 경우 컴파일된 실행 파일이 상승된 컨텍스트에서만 실행 (필요 시 UAC 대화상자 표시)
supportOS = 최신 Windows 버전의 함수 사용 (차이를 보려면 [Environment]::OSVersion 실행)
virtualize = 응용 프로그램 가상화 활성화 (x86 런타임 강제)
longPaths = OS에서 활성화된 경우 긴 경로(260자 초과) 사용 (Windows 10에서만 작동)
생성된 실행 파일에는 다음의 예약된 매개변수가 있습니다:
-? [<MODIFIER>] 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:<FILENAME> 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는 Powershell Core와 함께 사용할 수 있습니다. 위에서 설명한 대로 Powershell Core에 PS2EXE 모듈을 설치하기만 하면 됩니다. 그러나 .Net Core에는 컴파일러가 포함되어 있지 않으므로 .Net Framework의 컴파일러가 사용됩니다 (.Net Framework와 Powershell 5.1은 Windows에 포함되어 있습니다).
이러한 이유로 PS2EXE는 Powershell 5.1 호환 스크립트만 컴파일하고 .Net 4.x 바이너리를 생성하지만, 지원되는 모든 Windows OS에서 종속성 없이 직접 사용할 수 있습니다.
-embedFiles 매개변수 뒤에 파일 경로가 포함된 해시 테이블을 사용하면 해당 파일이 컴파일된 실행 파일에 포함됩니다. 실행 파일 시작 시 해당 파일은 지정된 경로의 디스크에 기록됩니다. 예: -embedFiles @{'Targetfilepath1'='Sourcefilepath1';'Targetfilepath2'='Sourcefilepath2'} 소스 파일 이름은 고유해야 합니다. 절대 경로와 상대 경로 모두 허용됩니다. 대상 경로의 경우 '.\' 로 시작하는 상대 경로는 실행 파일 기준 상대 경로로 해석되며, 선행 '.\' 없이 시작하면 런타임 시 현재 경로 기준 상대 경로로 해석됩니다. 필요한 경우 시작 시 디렉터리가 자동으로 생성됩니다. 대상 경로에서 %TEMP% 또는 %APPDATA% 와 같은 cmd.exe 표기법의 환경 변수는 런타임 시 확장됩니다. 포함된 파일 중 하나를 만드는 데 실패하면 컴파일된 실행 파일이 즉시 중지됩니다.
기본 입출력 명령은 PS2EXE를 위해 C#으로 다시 작성해야 했습니다. 콘솔 모드에서 Write-Progress (작업량이 너무 많음) 및 Start-Transcript/Stop-Transcript (Microsoft의 적절한 참조 구현 없음)는 구현되지 않았습니다.
기본적으로 Powershell에서 commandlet의 출력은 줄 단위로 형식이 지정됩니다 (문자열 배열). 명령이 10줄의 출력을 생성하고 GUI 출력을 사용하는 경우 각각 OK를 기다리는 10개의 메시지 상자가 나타납니다. 이를 방지하려면 명령을 Out-String commandlet에 파이프하십시오. 그러면 출력이 10줄의 단일 문자열 배열로 변환되어 모든 출력이 하나의 메시지 상자에 표시됩니다 (예: dir C:\ | Out-String).
PS2EXE는 생성된 실행 파일 이름 + ".config"로 구성 파일을 만들 수 있습니다. 대부분의 경우 이러한 구성 파일은 필요하지 않으며, 사용할 .Net Framework 버전을 알려주는 매니페스트입니다. 일반적으로 실제 .Net Framework를 사용하므로 구성 파일 없이 실행 파일을 실행해 보십시오.
컴파일된 스크립트는 원래 스크립트와 동일하게 매개변수를 처리합니다. 한 가지 제한 사항은 Windows 환경에서 비롯됩니다. 모든 실행 파일의 모든 매개변수는 STRING 유형입니다. 매개변수 유형에 대한 암시적 변환이 없는 경우 스크립트에서 명시적으로 변환해야 합니다. 동일한 제한 사항으로 실행 파일에 콘텐츠를 파이프할 수도 있습니다 (모든 파이프 값은 STRING 유형).
컴파일된 스크립트에 암호를 절대 저장하지 마십시오! -extract 매개변수를 사용하여 스크립트를 간단히 디컴파일할 수 있습니다. 예를 들어
Output.exe -extract:C:\Output.ps1
Output.exe에 저장된 스크립트를 디컴파일합니다. 그리고 참고: 스크립트는 (의도적으로) 실행 파일에 일반 텍스트로 저장됩니다!
PS2EXE는 스크립트를 실행 파일로 변환하므로 스크립트 관련 변수를 더 이상 사용할 수 없습니다. $MyInvocation 변수는 스크립트와 다른 값으로 설정됩니다. 특히 $PSScriptRoot 변수는 비어 있습니다. 대신 $ScriptRoot를 사용할 수 있습니다.
컴파일 여부와 관계없이 다음 코드 줄로 $PSScriptRoot를 독립적으로 얻을 수 있습니다:
if (!$PSScriptRoot) { $PSScriptRoot = $ScriptRoot }
-noConsole 모드의 스크립트에서 외부 창이 열리면 (예: Get-Credential의 경우 또는 cmd.exe 셸이 필요한 명령의 경우) 다음 창이 백그라운드에서 열립니다. 그 이유는 외부 창을 닫을 때 Windows가 부모 창을 활성화하려고 하기 때문입니다. 컴파일된 스크립트에는 창이 없으므로 대신 컴파일된 스크립트의 부모 창(일반적으로 Explorer 또는 Powershell 창)이 활성화됩니다. 이 문제를 해결하려면 $Host.UI.RawUI.FlushInputBuffer()가 활성화할 수 있는 보이지 않는 창을 엽니다. $Host.UI.RawUI.FlushInputBuffer()를 호출하면 이 창이 닫힙니다 (계속 반복). 다음 예제는 "ipconfig | Out-String"을 단일 호출로 실행할 때 더 이상 백그라운드에서 창이 열리지 않습니다:
$Host.UI.RawUI.FlushInputBuffer()
ipconfig | Out-String
$Host.UI.RawUI.FlushInputBuffer()