웹에서 파일을 다운로드해야하지만 반복적으로 링크를 클릭하는 것을 싫어하시나요? 웹에서 파일을 정기적으로 다운로드하는 작업이 포함되어 있다면, 이 작업을 자동화하고 싶을 것입니다. 왜 PowerShell을 대체 PowerShell wget처럼 파일을 다운로드하는 데 사용하지 않을까요?
Windows PowerShell과 PowerShell은 파일 다운로드 기능을 갖추고 있습니다. PowerShell을 사용하여 파일을 다운로드하는 것은 어떤 cmdlet과 .NET 클래스를 사용하고 어떻게 사용하는지를 알면 됩니다.
이 기사에서는 웹에서 파일을 다운로드하는 다양한 방법을 배우게 될 것입니다.
전제 조건
이 기사는 실습을 통한 학습이므로 예제를 따를 수 있도록 몇 가지 전제 조건이 필요합니다. 기본 요구 사항은 다음과 같습니다.
- A computer that is running on Windows 10 or higher. This computer is where you will run the scripts/commands featured in this article.
- Windows PowerShell 5.1 또는 PowerShell 7.1 (권장).
- Windows 10에는 이미 Windows PowerShell 5.1이 포함되어 있습니다.
- A web site that hosts the files to download.
- 인증되지 않은 파일 다운로드의 경우 무료인 Tele2 Speedtest 사이트를 사용하는 것이 좋습니다.
- 인증을 필요로하는 파일 다운로드를 테스트하려면 HTTP 파일 서버를 구축해야 할 수도 있습니다. 무료 HTTP 파일 서버의 예는 HFS by Rejetto입니다.
URL에서 파일을 다운로드하는 데 PowerShell 사용하기: 네 가지 방법
제3자 도구에 의존하지 않는 PowerShell을 사용하여 파일을 다운로드하는 네 가지 방법이 있습니다. 이들은 다음과 같습니다:
Invoke-WebRequest
Invoke-RestMethod
Start-BitsTransfer
- .NET WebClient Class.
이 네 가지 방법 중 어떤 것을 사용하든, 작동하기 위해 필요한 로직과 구성 요소는 동일합니다. 파일의 위치를 가리키는 소스 URL과 다운로드한 파일을 저장할 대상 경로가 있어야 합니다. 웹 서버에서 요구하는 경우 자격 증명을 입력해야 합니다.
다음 섹션에서는 이 네 가지 방법 각각을 보여줍니다. PowerShell을 사용하여 파일을 다운로드할 때 어떤 방법을 적용할지는 여러분의 결정에 달려 있습니다.
PowerShell wget 대체로서의 Invoke-WebRequest 사용하기
파일을 다운로드하기 위한 PowerShell의 첫 번째 방법은 Invoke-WebRequest
cmdlet을 사용하는 것입니다. 아마도 이 문서에서 가장 많이 사용되는 cmdlet인 Invoke-WebRequest
은 HTTP, HTTPS 및 FTP 링크를 다운로드할 수 있습니다.
소스 위치에 사용자 로그인이 필요한 경우 Invoke-WebRequest
cmdlet은 자격 증명을 사용하여 요청을 처리할 수 있습니다.
파일을 다운로드하기 위해 아래 구문은 원하는 결과를 얻기 위해 필요한 최소한의 매개변수를 보여줍니다.
예를 들어, 아래 코드는 웹 사이트에서 이름이 10MB.zip인 파일을 다운로드하고, 다운로드한 파일을 C:\dload\10MB.zip에 저장합니다. 아래 코드를 PowerShell 세션에 복사하여 붙여넣어 테스트할 수 있습니다.
아래 예제는 PowerShell에서 위의 코드를 실행한 후 예상되는 결과를 보여줍니다. 보시다시피, 파일 다운로드가 성공했습니다.

만약 소스에 접근하기 전에 인증이 필요한 경우는 어떨까요? 예를 들어, 아래 코드는 사용자가 로그인해야 하는 비공개 웹사이트에서 파일을 다운로드합니다.
하지만, 인증되지 않은 접근으로 인해 다운로드가 실패했습니다.

인증이 필요한 경우, -Credential
매개변수를 사용하여 요청에 자격 증명을 추가해야 합니다. 아래 코드의 첫 번째 줄은 자격 증명(사용자 이름과 비밀번호)을 입력하도록 요청하고, $credential
변수에 저장합니다.
아래 예제는 위의 코드를 PowerShell에서 실행할 때 예상되는 결과를 보여줍니다. 보시다시피, Get-Credential
cmdlet은 PowerShell 자격 증명 요청을 띄웠습니다. 이번에는 Invoke-WebRequest
에서 자격 증명을 사용하면 다운로드가 성공했습니다.

관련 정보: PowerShell Get-Credential Cmdlet 및 자격 증명에 관련된 모든 내용 사용하기
Invoke-WebRequest 사용 시 구문 분석 오류 확인하기
A crucial thing to remember when using Invoke-WebRequest
in Windows PowerShell is that, by default, this cmdlet uses the Internet Explorer engine to parse data. The error below may happen when using Invoke-WebRequest
on computers without the Internet Explorer in it.
명령을 다시 실행해야 하지만, 이번에는 -UseBasicParsing
스위치를 포함해야 합니다.
Windows PowerShell에서는 다음과 같은 오류 메시지를 받을 수 있습니다: 응답 콘텐츠를 구문 분석할 수 없습니다. Internet Explorer 엔진을 사용할 수 없거나 Internet Explorer의 첫 번째 실행 구성이 완료되지 않았습니다. UseBasicParsing 매개 변수를 지정하고 다시 시도하십시오.
PowerShell Core 6.0부터는 Invoke-WebRequest
cmdlet은 기본 구문 분석만 사용합니다. 따라서 -UseBasicParsing
매개 변수는 더 이상 필요하지 않습니다.
Invoke-RestMethod 사용
Invoke-RestMethod
cmdlet은 RESTful 웹 서비스에 HTTP 또는 HTTPS 요청을 보내는 데 더 적합합니다. 이 cmdlet은 Microsoft Graph API와 같은 REST API와 상호 작용하는 요청에 더 적합합니다.
웹에서 파일을 직접 다운로드하는 경우, Invoke-RestMethod
는 훌륭한 대안입니다. 다른 방식으로 생각하지 마십시오. 직접 웹 링크에서 파일을 다운로드하는 데 Invoke-RestMethod
와 Invoke-WebRequest
를 사용하는 데는 차이가 거의 없습니다.
Invoke-RestMethod을 사용하여 파일 다운로드
Invoke-RestMethod
를 사용하여 파일을 다운로드하려면 아래 구문을 사용하십시오. 명령은 Invoke-WebRequest
와 동일한 매개 변수를 사용하는 것을 알 수 있습니다.
아래 예제 코드에서 파일은 $source
변수의 URL 값에서 다운로드되고, $destination
변수에 정의된 경로에 저장됩니다.
원본에 인증이 필요한 경우, -Credential
매개변수를 사용하여 자격 증명을 전달할 수 있습니다. 아래 예제는 자격 증명을 요청하고 $credential
변수에 저장합니다. 그런 다음, $credential
변수의 값을 -Credential
매개변수에 전달합니다.
또한, 파일 링크가 HTTPS가 아닌 HTTP 소스이므로 암호화되지 않은 인증이 전송되고 있음을 의미합니다. 일반적으로 보안을 위해 HTTP 소스 사용을 피해야 합니다. 그러나 HTTP 소스를 사용해야 하는 경우, 명령에 -AllowUnencryptedAuthentication
스위치를 추가해야 합니다.
Start-BitsTransfer 사용하기
Start-BitsTransfer
는 클라이언트와 서버 컴퓨터 간에 파일을 전송하기 위해 특별히 설계된 PowerShell cmdlet입니다. 이 PowerShell cmdlet은 Windows 운영 체제에 기본으로 내장된 백그라운드 지능형 전송 서비스 (BITS)에 의존합니다.
Start-BitsTransfer
가 BITS를 필요로 함은 이 cmdlet이 비-Windows 컴퓨터에서 사용할 수 없다는 것을 의미합니다. 반면, Start-BitsTransfer
는 BITS 자체의 이점을 누릴 수 있습니다. 이러한 이점 중 일부는 다음과 같습니다:
- 네트워크 대역폭 및 사용량 인식.
- 중단 처리 (재개, 자동 재개, 일시 정지 등)
- 여러 파일을 백그라운드 작업으로 다운로드.
- 다운로드 작업 우선 순위 설정.
파일 다운로드
파일을 다운로드하는 데 Start-BitsTransfer
를 PowerShell에서 사용하는 기본 방법은 소스와 대상을 지정하는 것입니다. 아래 스크립트를 사용하면 $source
와 $destination
값을 원하는 대로 변경하기만 하면 됩니다.
아래 데모에서 볼 수 있듯이 파일은 경로 c:\dload\100MB.zip로 다운로드됩니다.

대상이 지정되지 않은 경우
Start-BitsTransfer
는 파일을 현재 작업 디렉토리에 다운로드하여 저장합니다. 예를 들어 C:\dload에서Start-BitsTransfer
를 실행하면 파일이 동일한 디렉토리에 다운로드됩니다.
인증이 필요한 다운로드의 경우 Start-BitsTransfer
에는 -Credential
매개변수가 있으며 PSCredential 개체를 사용합니다.
여러 파일 다운로드
여러 파일을 다운로드하기 위해 두 개의 열이 있는 CSV 파일을 만들어야 합니다. 파일 이름을 filelist.txt로 지정하십시오. 첫 번째 열에는 소스 링크가 있어야 하고 두 번째 열에는 대상 경로가 있어야 합니다. 파일 내용은 아래와 같습니다.
관련: PowerShell에서 Import-Csv로 CSV 파일 관리
CSV 파일이 준비되면 아래 명령을 사용하여 파일 다운로드를 시작합니다. 이 명령은 Import-Csv
를 사용하여 CSV 파일을 가져오고 내용을 Start-BitsTransfer
에 전달합니다.
위의 코드가 작동하는 방법을 확인하기 위해 아래 데모를 참조하십시오. 보시다시피 다운로드가 시작되고 다운로드 진행 상황이 표시됩니다. 다운로드 프로세스 중에는 PowerShell 프롬프트를 사용할 수 없습니다.

다운로드 프로세스를 백그라운드 작업으로 시작하려면 Start-BitsTransfer
명령 끝에 -Asynchronous
스위치를 추가하기만 하면 됩니다.
초기에는 각 작업의 상태가 connecting으로 표시됩니다. 아래 스크린샷은 각 파일 다운로드의 작업 ID를 보여줍니다.

이제 다운로드 프로세스를 시작했으므로 다운로드가 완료되었는지 확인하고 싶을 것입니다. 다운로드 작업 상태를 확인하려면 Get-BitsTransfer
cmdlet을 사용하십시오. 아래에서 보시다시피 다운로드 작업의 상태가 Transferred로 변경되었습니다.

WebClient 클래스와 HttpClient 클래스(.NET Framework) 사용
PowerShell은 .NET 기반이며, 그 특성을 통해 .NET 자체의 기능을 활용할 수 있습니다. PowerShell에서 파일을 다운로드하는 데 사용할 수 있는 두 가지 .NET 클래스는 WebClient와 HttpClient입니다.
더 많은 개발 및 기술적인 방식으로 이 두 개의 .NET 클래스에 대해 더 알고 싶다면, 다음을 시작으로 참고해보세요 → WebClient vs. HttpClient vs. HttpWebRequest을 언제 사용해야 할까요?. 다음 섹션에서는 PowerShell에서 WebClient 및 HttpClient를 사용하여 웹에서 파일을 다운로드하는 방법을 배웁니다.
System.Net.WebClient를 사용하여 파일 다운로드하기
WebClient 클래스를 사용하려면 System.Net.WebClient
**타입의 객체를 초기화해야 합니다. 아래 예제에서 $webClient
은 새로운 System.Net.WebClient
객체입니다. 그런 다음 DownloadFile()
메서드를 사용하여 소스로부터 파일 다운로드를 시작합니다.
관련 링크: 코딩 속도를 높이기 위해 PowerShell 데이터 타입 가속기 사용하기
아래 코드를 복사하여 PowerShell 세션에서 실행하여 테스트해보세요. 에러가 없는 한 화면에 진행 상황이나 출력이 나타나지 않습니다. 그러나 다운로드가 완료될 때까지 PowerShell 프롬프트는 잠길 것입니다.
만약 소스가 파일 다운로드를 허용하기 위해 인증을 요구한다면, 아래의 코드를 사용할 수 있습니다. 첫 번째 줄은 자격 증명을 요청하고 $credentials
변수에 저장합니다. $credential
의 값은 파일 다운로드 요청에 포함됩니다.
이 Microsoft 문서에 따르면: “새로운 개발에는 WebClient 클래스를 사용하지 않는 것이 좋습니다. 대신 System.Net.Http.HttpClient 클래스를 사용하세요.”
WebClient 클래스가 더 이상 사용되지 않으며, Microsoft에서 지원하는 새로운 클래스는 HttpClient 클래스입니다. 하지만 걱정하지 마세요. 다음 섹션에서는 PowerShell에서 HttpClient 클래스를 사용하여 웹에서 파일을 다운로드하는 방법에 대해 이야기합니다.
System.Net.Http.HttpClient를 사용하여 파일 다운로드하기
WebClient 클래스와 마찬가지로, 먼저 System.Net.Http.HttpClient
를 생성해야 합니다. 아래의 코드를 사용하여 파일을 $source
에서 $destination
으로 다운로드합니다. 각 줄의 위에 주석을 참조하여 각 줄의 코드가 무엇을 하는지 알 수 있습니다.
아래의 코드는 실시간이며, PowerShell 세션에서 실행하여 테스트할 수 있습니다.
파일을 다운로드하는 경우 인증이 필요한 경우, HttpClient 개체에 자격 증명을 추가해야 합니다. 파일 다운로드 요청에 자격 증명을 포함하려면 새로운 System.Net.Http.HttpClientHandler
개체를 만들어 자격 증명을 저장합니다.
아래의 코드를 복사하여 PowerShell에서 실행하여 테스트할 수 있습니다. 또는 PowerShell 스크립트로 실행할 수도 있습니다. 이 예제에서는 코드를 download-file.ps1로 저장합니다.
아래 데모는 PowerShell 스크립트를 실행하여 파일을 다운로드할 때의 결과를 보여줍니다.
시작할 때 디렉토리에는 스크립트 파일만 있습니다. 사용자 이름과 비밀번호를 입력하는 프롬프트가 나타납니다. 그런 다음 스크립트가 파일을 다운로드합니다. 파일을 다운로드한 후에는 목적지 디렉토리 안에 새로운 파일이 있는 것을 확인할 수 있습니다.

결론
Windows PowerShell과 PowerShell Core는 파일을 다운로드하는 내장 기능을 제공하여 PowerShell wget 대체제 역할을 합니다! 비밀번호로 보호된 소스, 단일 또는 다중 파일을 다운로드하는 경우에도 PowerShell을 사용할 수 있습니다.
이 문서에서 다루는 파일 다운로드 방법은 Windows PowerShell과 PowerShell Core에서 모두 작동합니다. 이는 Windows 및 비-Windows 시스템 모두에 적용되는 것을 의미합니다. 다만 Start-BitsTransfer
는 제외됩니다.
그리고 PowerShell은 명령 프롬프트 이상의 기능을 제공하기 때문에 배운 내용을 스크립트로 변환할 수 있습니다. 이는 자동화의 기회를 의미합니다. 더 이상 URL을 복사하고 링크를 클릭하며 수동으로 다운로드를 기다릴 필요가 없습니다.
Source:
https://adamtheautomator.com/powershell-download-file/