CMD vs Powershell

Hun·2일 전

commit

목록 보기
3/4
post-thumbnail

🤯 이거 CMD에서 되던 건데?

윈도우 서버에서 이것저것 확인하다 보면 이런 순간이 옵니다.

  • 어떤 명령어는 CMD에서도, PowerShell에서도 똑같이 잘 되고
  • 어떤 명령어는 CMD에선 되는데 PowerShell에선 에러가 나고
  • 어떤 건 PowerShell에서 실행은 되는데 전혀 다른 결과가 나오고..

처음엔 그냥 "이건 CMD용, 저건 PowerShell용" 하고 외우듯이 쓰다가, 어느 순간 궁금해졌습니다.

  1. 왜 어떤 건 되고 어떤 건 안 될까?
  2. 둘 다 되는 명령어라면 누가 더 좋을까?
  3. 명령어가 다르다면 어떻게 다른 걸까?

그래서 한번 정리해 봤습니다.


📌 먼저 둘은 뭐가 다른가

CMD = 텍스트를 주고받는 옛날 셸
PowerShell = 객체(Object)를 주고받는 .NET 기반 셸 + 스크립트 언어

항목CMDPowerShell
계보MS-DOS 시절부터 이어진 cmd.exe2006년 등장, .NET 기반
파이프로 넘기는 것텍스트객체
스크립트.bat, .cmd.ps1
명령어 스타일dir, copy, delGet-ChildItem, Copy-Item (동사-명사)
변수 / 환경 변수%NAME%, %PATH%$name, $env:Path
크로스 플랫폼❌✅ (PowerShell 7)

❓ 1. 왜 어떤 건 되고 어떤 건 안 될까?

답은 "그 명령어가 누구 소속이냐" 에 있었습니다.
윈도우에서 치는 명령어는 크게 세 종류예요.

종류예시CMDPowerShell
외부 프로그램 (.exe)ipconfig, ping, netstat, tasklist, findstr✅✅
CMD 내장 명령어dir, copy, del, set, mklink✅⚠️ 별칭이 있으면 되는 척, 없으면 에러
PowerShell cmdletGet-Process, Get-Service, Test-NetConnection❌✅
  • 외부 프로그램은 C:\Windows\System32 에 있는 독립된 실행 파일이라, 어느 셸에서 부르든 같은 프로그램이 실행됩니다. 그래서 둘 다 잘 됐던 거예요.
  • CMD 내장 명령어는 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 로 확장자까지 명시
curlcurl.exe 실행Windows PowerShell 5.1에선 Invoke-WebRequest 별칭😶 옵션 형식이 다름 → curl.exe
wherewhere.exe (파일 경로 찾기)Where-Object 별칭😶 → where.exe

💡 팁: PowerShell에서 CMD 시절 명령어를 확실하게 쓰고 싶으면 .exe 까지 붙여서 호출하면 별칭을 피할 수 있습니다.


⚖️ 2. 둘 다 되는 명령어라면 누가 더 좋을까?

경우에 따라 다릅니다.

외부 프로그램이라면 → 차이 없음

ipconfig, ping, netstat 은 어느 셸에서 부르든 같은 exe가 실행되니 결과도 똑같습니다.
차이는 그 결과를 받아서 어떻게 가공하느냐에서만 생겨요.

별칭으로 되는 명령어라면 → 하는 일은 비슷, 결과물의 성격이 다름

dir 을 예로 들면

  • CMD 의 dir → 화면에 찍힌 글자
  • PowerShell 의 dir → 이름, 크기, 수정일 같은 속성을 가진 파일 객체

그래서

  • 한 번 보고 끝낼 거면 → 가볍고 빨리 뜨는 CMD도 충분
  • 결과를 걸러내고, 정렬하고, 다른 작업에 넘길 거면 → PowerShell이 압도적으로 편함

🔍 3. 명령어가 다르다면 어떻게 다를까?

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 같은 속성이 살아있는 객체가 파이프(|)로 넘어가서 바로 조건과 정렬을 걸 수 있습니다.

자주 쓰는 명령어 대응표

하는 일CMDPowerShell
목록 보기dirGet-ChildItem
파일 내용 보기typeGet-Content
복사 / 삭제copy / delCopy-Item / Remove-Item
프로세스 목록tasklistGet-Process
서비스 확인sc queryGet-Service
포트 연결 확인telnet (별도 설치)Test-NetConnection -Port

📝 정리

  • 외부 프로그램(.exe) 은 어디서든 똑같이 된다
  • CMD 내장 명령어는 PowerShell에선 별칭으로 흉내만 내거나, 아예 없다
  • 이름이 같아도 PowerShell에선 다른 명령어일 수 있다 → 헷갈리면 Get-Command 로 정체 확인
  • CMD는 글자를 넘기고, PowerShell은 객체를 넘긴다
profile
구른다

0개의 댓글