cmd 배치 파일과 PowerShell 은 별개의 셸이라 변수·주석·출력 문법이 다르다. 환경 변수 설정 스크립트를 두 셸로 작성하는 방법을 정리했다. .ps1 실행 정책 오류와 메일로 보낸 분할 압축 파일이 깨지는 원인은 아래 트러블슈팅 문서에 있다.
@echo off
chcp 65001 > nul
REM 현재 cmd 세션에만 적용된다
set "aa=aa"
set "PROJECT_HOME=C:\my\project"
echo aa = %aa%
echo PROJECT_HOME = %PROJECT_HOME%
pause
set "이름=값" 처럼 따옴표로 감싸면 값에 공백이 있어도 안전하고 따옴표는 값에 들어가지 않는다. 영구 저장은 setx 이며 새로 여는 창부터 적용된다. 주석은 REM 이 표준이고 :: 는 괄호 블록 안에서 오류를 낼 수 있다. 줄 끝 주석은 없으며 set "a=b" REM 설명 은 REM 까지 값으로 들어간다. echo 는 따옴표를 그대로 출력하므로 감싸지 않고, < > | & 는 ^ 로 이스케이프한다. 빈 변수를 출력할 때는 echo.%aa% 로 쓴다.
# 현재 PowerShell 세션에만 적용된다
$env:aa = "aa"
$env:PROJECT_HOME = "C:\my\project"
Write-Host "aa = $env:aa"
Write-Host "PROJECT_HOME = $env:PROJECT_HOME"
# 영구 저장 (User 또는 Machine)
[Environment]::SetEnvironmentVariable("PROJECT_HOME", "C:\my\project", "User")
$env:name 은 환경 변수로 자식 프로세스에 전달되고, $name 은 세션 변수라 외부 프로그램에 넘어가지 않는다. 문자열 치환은 큰따옴표 안에서만 된다. Write-Host 는 화면 전용, Write-Output(별칭 echo) 은 파이프라인으로 값을 넘긴다. 현재 창에 변수를 남기려면 dot-sourcing(. .\setenv.ps1) 으로 실행한다.
| 구분 | cmd (.bat) | PowerShell |
|---|---|---|
| 환경변수 설정 | set "name=aaa" |
$env:name="aaa" |
| 변수 참조 | %name% |
$env:name |
| 영구 저장 | setx name "aaa" |
[Environment]::SetEnvironmentVariable(...) |
| 주석 | REM |
#, <# ... #> |