개요
New-Guid와 Get-Random은 서로 다른 문제를 풀지만 둘 다 “값을 만들어내는” 유틸리티 cmdlet이라는 공통점으로 Part 16(네트워크와 웹)을 마무리하는 이 장에 함께 묶었다. 98장에서 환경 변수와 드라이브를 한 챕터로 묶었던 것과 같은 방식이다 — 네트워크 자체를 다루지는 않지만, API 요청 본문에 고유 ID를 채우거나(113장과 조합) 테스트 데이터를 무작위로 생성하는 등 스크립팅 전반에서 반복적으로 필요한 두 도구다.
정신 모델은 “New-Guid는 ‘전 세계 어디서도 겹치지 않을 이름표를 하나 뽑는 기계’이고, Get-Random은 ‘주사위를 굴리거나 상자에서 카드를 뽑는 기계’“라는 것이다. 전자는 고유성이 핵심이고, 후자는 무작위성이 핵심이다.
두 cmdlet은 겉보기엔 단순해 보이지만, 테스트 데이터 생성이나 API 요청 식별자 부여처럼 자동화 스크립트 전반에서 은근히 자주 등장하는 반복 작업을 표준화해 준다는 공통점이 있다. 이런 유틸리티 cmdlet을 매번 .NET 클래스를 직접 호출해 재구현하는 대신, 이미 검증된 표준 cmdlet으로 처리하면 스크립트의 가독성과 일관성이 함께 올라간다.
사용법
| |
종류
| cmdlet | 매개변수 | 동작 |
|---|---|---|
New-Guid | (없음) | 무작위 버전 4 GUID 생성 |
New-Guid | -Empty | 전부 0인 빈 GUID(00000000-...) 생성 |
New-Guid | -InputObject <문자열> | 문자열을 GUID 객체로 변환(파이프라인 입력도 가능) |
Get-Random | (없음) | 0–Int32.MaxValue 범위의 정수 무작위 반환 |
Get-Random | -Minimum/-Maximum | 지정 범위(최댓값 미포함) 내 무작위 정수·실수 반환 |
Get-Random | -InputObject + -Count | 컬렉션에서 무작위로 n개 선택(중복 없음) |
Get-Random | -Shuffle(PS 7.1+) | 컬렉션 전체를 무작위 순서로 재배열해 반환 |
Get-Random | -SetSeed | 재현 가능한 의사난수 시퀀스로 고정(디버깅용) |
예시
| |
주의사항·함정
Get-Random은 암호학적으로 안전한 난수를 보장하지 않는다: 내부적으로 의사난수 생성기(PRNG)를 쓰기 때문에, 토큰·비밀번호·암호화 키처럼 보안이 걸린 값을 만드는 데 Get-Random을 쓰면 안 된다. PowerShell 7.4부터 추가된 Get-SecureRandom이 암호학적으로 안전한 난수를 제공하므로, 보안이 중요한 상황에서는 이를 대신 사용해야 한다. 100장에서 다룬 SecureString처럼 보안이 걸린 값을 다룰 때는 “무작위처럼 보이는가"가 아니라 “예측 불가능함이 수학적으로 증명됐는가"를 기준으로 도구를 골라야 한다.
-SetSeed는 한 번 설정하면 세션이 끝날 때까지 그 세션의 모든 Get-Random 호출에 영향을 준다: 되돌릴 수 있는 기본값이 따로 없어서, 디버깅을 위해 시드를 고정했다가 잊어버리면 이후 스크립트의 “무작위” 값이 실제로는 예측 가능한 값이 되어버린다. 재현이 끝났으면 새 PowerShell 세션을 시작해 시드를 초기화하는 것이 안전하다.
-Maximum은 그 값을 포함하지 않는다: Get-Random -Maximum 100은 0부터 99까지만 반환하고 100은 나오지 않는다. 1부터 100까지를 원한다면 -Minimum 1 -Maximum 101처럼 범위를 한 칸 넓혀야 하며, 이 “미포함” 규칙을 놓치면 경계값에서 오프바이원 오류가 생긴다.
New-Guid가 만드는 GUID는 전역적으로 유일함을 통계적으로 보장할 뿐, 절대적 보장이 아니다: 버전 4 GUID는 128비트 무작위 값이라 실질적으로 충돌 가능성이 무시할 수 있는 수준이지만, 데이터베이스의 기본 키처럼 정말로 절대 겹치지 않아야 하는 경우라도 이 통계적 성격 자체를 이해하고 쓰는 것이 좋다. 충돌 확률이 사실상 0에 가깝다는 것과 수학적으로 절대 0이라는 것은 다른 이야기이므로, 규제가 엄격한 금융·의료 시스템의 식별자 설계에서는 이 차이를 명시적으로 문서화해 두는 편이 나중의 논쟁을 줄여준다.
이식성: 이 두 cmdlet은 플랫폼 종속적인 API가 아니라 .NET 표준 라이브러리 위에 얇게 얹힌 래퍼이므로, PowerShell 7 기준으로는 Windows·Linux·macOS 어디에서나 동일하게 동작한다는 점이 앞선 여러 장의 Windows 전용 cmdlet들과 다르다. Linux/macOS의 uuidgen 명령이 New-Guid와 정확히 대응하고, Bash의 $RANDOM 변수나 shuf 명령이 Get-Random과 개념적으로 유사하다. 다만 $RANDOM은 0–32767 범위의 정수만 반환하는 반면 Get-Random은 -Minimum/-Maximum으로 임의 범위와 실수까지 다룰 수 있고, 컬렉션에서 직접 무작위 표본을 뽑는 -Count·-Shuffle 기능까지 통합돼 있어 셸 내장 기능보다 표현력이 넓다.
![Featured image of post [PowerShell] 114. New-Guid/Get-Random — 유틸리티 모음](/post/powershell/new-guid-get-random-utility-powershell/wordcloud_hu_569c5906c836e2f0.webp)
![[PowerShell] 112. Get-NetIPConfiguration/Get-NetAdapter](/post/powershell/get-netipconfiguration-get-netadapter-powershell/wordcloud_hu_52dd3e956ba2b525.webp)
![[PowerShell] 113. Invoke-WebRequest/Invoke-RestMethod](/post/powershell/invoke-webrequest-invoke-restmethod-powershell/wordcloud_hu_d83d75f2879b9315.webp)
![[PowerShell] 114. New-Guid/Get-Random — 유틸리티 모음](/post/powershell/new-guid-get-random-utility-powershell/wordcloud_hu_e9ded1c7c447f201.webp)
![[PowerShell] 115. ActiveDirectory 모듈 개요와 Get-ADUser](/post/powershell/activedirectory-module-get-aduser-powershell/wordcloud_hu_975c1aa2fa88b4a7.webp)
![[PowerShell] 116. New-ADUser/Set-ADUser — 계정 생성·수정](/post/powershell/new-aduser-set-aduser-powershell/wordcloud_hu_fd894bb2538db14a.webp)
![[PowerShell] 71. Pester 소개 — Describe/It/Should](/post/powershell/pester-describe-it-should-powershell/wordcloud_hu_65e0d7d8ff97f59.webp)
![[PowerShell] 72. PSScriptAnalyzer — 정적 분석과 코딩 규칙](/post/powershell/psscriptanalyzer-static-analysis-powershell/wordcloud_hu_fb1acde140a2de4f.webp)
![[PowerShell] 73. Measure-Command — 성능 측정과 벤치마킹](/post/powershell/measure-command-benchmark-powershell/wordcloud_hu_b078f0ca79bf08ab.webp)
![[PowerShell] 00. 과정 개요와 커리큘럼](/post/powershell/getting-started-powershell/wordcloud_hu_15979a96cd2a594f.webp)
![[PowerShell] 100. Get-Credential과 PSCredential 객체](/post/powershell/get-credential-pscredential-object-powershell/wordcloud_hu_e8db052a57f9c242.webp)