윈도우 서버에서 이것저것 확인하다 보면 이런 순간이 옵니다.
처음엔 그냥 "이건 CMD용, 저건 PowerShell용" 하고 외우듯이 쓰다가, 어느 순간 궁금해졌습니다.
- 왜 어떤 건 되고 어떤 건 안 될까?
- 둘 다 되는 명령어라면 누가 더 좋을까?
- 명령어가 다르다면 어떻게 다른 걸까?
그래서 한번 정리해 봤습니다.
CMD = 텍스트를 주고받는 옛날 셸
PowerShell = 객체(Object)를 주고받는 .NET 기반 셸 + 스크립트 언어
| 항목 | CMD | PowerShell |
|---|---|---|
| 계보 | MS-DOS 시절부터 이어진 cmd.exe | 2006년 등장, .NET 기반 |
| 파이프로 넘기는 것 | 텍스트 | 객체 |
| 스크립트 | .bat, .cmd | .ps1 |
| 명령어 스타일 | dir, copy, del | Get-ChildItem, Copy-Item (동사-명사) |
| 변수 / 환경 변수 | %NAME%, %PATH% | $name, $env:Path |
| 크로스 플랫폼 | ❌ | ✅ (PowerShell 7) |
답은 "그 명령어가 누구 소속이냐" 에 있었습니다.
윈도우에서 치는 명령어는 크게 세 종류예요.
| 종류 | 예시 | CMD | PowerShell |
|---|---|---|---|
| 외부 프로그램 (.exe) | ipconfig, ping, netstat, tasklist, findstr | ✅ | ✅ |
| CMD 내장 명령어 | dir, copy, del, set, mklink | ✅ | ⚠️ 별칭이 있으면 되는 척, 없으면 에러 |
| PowerShell cmdlet | Get-Process, Get-Service, Test-NetConnection | ❌ | ✅ |
C:\Windows\System32 에 있는 독립된 실행 파일이라, 어느 셸에서 부르든 같은 프로그램이 실행됩니다. 그래서 둘 다 잘 됐던 거예요.cmd.exe 안에 들어있는 기능이라 파일로 존재하지 않습니다. PowerShell은 이걸 모르니, 실행이 안 되는 게 정상이에요.dir, cd, copy 같은 건 PowerShell에서도 되잖아요? 그건 PowerShell이 비슷한 이름의 별칭(Alias) 을 만들어 둔 것뿐입니다.💡 PowerShell에서
Get-Command dir을 쳐보면
dir이 사실은Get-ChildItem의 별칭이라는 걸 확인할 수 있어요.
제가 헷갈렸던 대부분이 여기였습니다.
이름이 같으니 같은 명령어인 줄 알았는데, PowerShell에선 전혀 다른 명령어로 연결돼 있던 거죠.
| 입력 | CMD에서 | PowerShell에서 | 결과 |
|---|---|---|---|
dir /s | 하위 폴더까지 검색 | Get-ChildItem 에 /s 옵션이 없음 | ❌ 에러 → Get-ChildItem -Recurse |
echo %PATH% | PATH 값 출력 | %PATH% 를 그냥 글자로 출력 | 😶 → echo $env:Path |
set A=1 | 변수 설정 | Set-Variable 별칭으로 동작이 다름 | 😶 → $A = 1 |
mklink | 링크 생성 | 없는 명령어 | ❌ → cmd /c mklink 또는 New-Item -ItemType SymbolicLink |
sc query | 서비스 조회 (sc.exe) | Windows PowerShell 5.1에선 sc 가 Set-Content 별칭 | 😱 → sc.exe query 로 확장자까지 명시 |
curl | curl.exe 실행 | Windows PowerShell 5.1에선 Invoke-WebRequest 별칭 | 😶 옵션 형식이 다름 → curl.exe |
where | where.exe (파일 경로 찾기) | Where-Object 별칭 | 😶 → where.exe |
💡 팁: PowerShell에서 CMD 시절 명령어를 확실하게 쓰고 싶으면
.exe까지 붙여서 호출하면 별칭을 피할 수 있습니다.
경우에 따라 다릅니다.
ipconfig, ping, netstat 은 어느 셸에서 부르든 같은 exe가 실행되니 결과도 똑같습니다.
차이는 그 결과를 받아서 어떻게 가공하느냐에서만 생겨요.
dir 을 예로 들면
dir → 화면에 찍힌 글자dir → 이름, 크기, 수정일 같은 속성을 가진 파일 객체그래서
CPU 많이 쓰는 프로세스 찾기로 비교해 보면 차이가 확 보입니다.
:: CMD - 출력된 글자에서 "java"가 들어간 줄만 걸러내는 수준
tasklist | findstr "java"
# PowerShell - 객체의 속성으로 필터, 정렬, 선택
Get-Process | Where-Object CPU -gt 100 | Sort-Object CPU -Descending | Select-Object -First 5
CMD는 글자를 잘라서 찾는 방식이라 "CPU가 100 이상인 것만" 같은 조건을 걸기 어렵고,
PowerShell은 CPU, Name, Id 같은 속성이 살아있는 객체가 파이프(|)로 넘어가서 바로 조건과 정렬을 걸 수 있습니다.
| 하는 일 | CMD | PowerShell |
|---|---|---|
| 목록 보기 | dir | Get-ChildItem |
| 파일 내용 보기 | type | Get-Content |
| 복사 / 삭제 | copy / del | Copy-Item / Remove-Item |
| 프로세스 목록 | tasklist | Get-Process |
| 서비스 확인 | sc query | Get-Service |
| 포트 연결 확인 | telnet (별도 설치) | Test-NetConnection -Port |
- 외부 프로그램(.exe) 은 어디서든 똑같이 된다
- CMD 내장 명령어는 PowerShell에선 별칭으로 흉내만 내거나, 아예 없다
- 이름이 같아도 PowerShell에선 다른 명령어일 수 있다 → 헷갈리면
Get-Command로 정체 확인- CMD는 글자를 넘기고, PowerShell은 객체를 넘긴다