3

After looking at various stackoverflow questions, I found several ways to download a file from a command line without interaction from the user.

The only one that worked for me also works only on Windows 10 natively :

curl -sko %TEMP%\file.txt "https://some.hostname/file.txt"

But installing an external tool like wget/curl is what I want to avoid.

What didn't work for me because of proxy errors :

Command:

bitsadmin.exe /transfer "dljob" "https://some.hostname/file.txt" %TEMP%\file.txt

Error:

DISPLAY: 'dljob' TYPE: DOWNLOAD STATE: ERROR
PRIORITY: NORMAL FILES: 0 / 1 BYTES: 0 / UNKNOWN
Unable to complete transfer.
ERROR FILE:    https://some.hostname/file.txt -> E:\Users\xxx\AppData\Local\Temp\file.txt
ERROR CODE:    0x80190197
ERROR CONTEXT: 0x00000005

Command:

powershell -Command "(New-Object Net.WebClient).DownloadFile('https://some.hostname/file.txt', '%TEMP%\file.txt')"

Error:

Exception calling "DownloadFile" with "2" argument(s): "The remote server returned an error: (407) Proxy Authentication Required."
At line:1 char:1
+ (New-Object Net.WebClient).DownloadFile('https://some.hostname/file.txt ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : WebException

Command:

powershell -Command "Invoke-WebRequest 'https://some.hostname/file.txt' -OutFile %TEMP%\file.txt

Error:

Invoke-WebRequest :
Authentication required
You must be authenticated to access this URL.
...
Mozilla/5.0 (Windows NT; Windows NT 10.0; en-US) WindowsPowerShell/5.1.17763.1007
At line:1 char:1
+ Invoke-WebRequest 'https://some.hostname/file.txt ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

This didn't work either :

powershell -Command "$client.Credentials = Get-Credential; $browser.Proxy.Credentials =[System.Net.CredentialCache]::DefaultNetworkCredentials; (New-Object Net.WebClient).DownloadFile('https://some.hostname/file.txt', 'file.txt')"

Error :

cmdlet Get-Credential at command pipeline position 1
Supply values for the following parameters:
Credential

Get-Credential : Cannot process command because of one or more missing mandatory parameters: Credential.
At line:1 char:23
+ $client.Credentials = Get-Credential; $browser.Proxy.Credentials =[Sy ...
+                       ~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-Credential], ParameterBindingException
    + FullyQualifiedErrorId : MissingMandatoryParameter,Microsoft.PowerShell.Commands.GetCredentialCommand

The property 'Credentials' cannot be found on this object. Verify that the property exists and can be set.
At line:1 char:39
+ ... Credential; $browser.Proxy.Credentials =[System.Net.CredentialCache]: ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyNotFound

Exception calling "DownloadFile" with "2" argument(s): "The remote server returned an error: (407) Proxy
Authentication Required."
At line:1 char:124
+ ... redentials; (New-Object Net.WebClient).DownloadFile('https://some.hostname ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : WebException
Sybuser
  • 735
  • 10
  • 27

2 Answers2

1

Refer to this question Access web using Powershell and Proxy

You can try something like that in Powershell and suppose that you have already created a folder named as C:\Test:


$url = "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"
$file = "C:\Test\" + $url.Split("/")[-1]
$wb = New-Object System.Net.WebClient
$wb.Proxy.Credentials =[System.Net.CredentialCache]::DefaultNetworkCredentials
$wb.DownloadFile($url,$file)

EDIT : 14/08/2020 @17:08

I tried this on Windows Powershell ISE and it works 5/5 :

cls
$start_time = Get-Date
$url = "https://cdn2.unrealengine.com/Fortnite%2FBoogieDown_GIF-1f2be97208316867da7d3cf5217c2486da3c2fe6.gif"
$Folder = "$Env:Temp\DownloadFolder"

# We create a SubFolder Named "DownloadFolder" in the temporary file %Temp% if it doesn't exists yet !
If ((Test-Path -Path $Folder) -eq 0) { New-Item -Path $Folder -ItemType Directory | Out-Null }

# We can get the name of the file to be downloaded from the variable $url
# $url = "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"
# In our case the FileName will be = "googlelogo_color_272x92dp.png" or 
# Fortnite%2FBoogieDown_GIF-1f2be97208316867da7d3cf5217c2486da3c2fe6.gif
$file = $Folder+ "\" + $url.Split("/")[-1]

Try 
    {
      $wb = New-Object System.Net.WebClient
      $wb.Proxy.Credentials =[System.Net.CredentialCache]::DefaultNetworkCredentials
      $wb.DownloadFile($url,$file) 
      # better use Invoke-Item $Folder instead of ii          
      Invoke-Item $Folder 
      Write-Output "Running Script Time taken is : $((Get-Date).Subtract($start_time).Milliseconds) millisecond(s)"
    }

Catch 
    {
      Write-Host "Error from $url" `n"Message: [$($_.Exception.Message)"] -ForegroundColor Red -BackgroundColor DarkBlue
    }
surfmuggle
  • 5,527
  • 7
  • 48
  • 77
Hackoo
  • 18,337
  • 3
  • 40
  • 70
  • didn't work for me: Exception calling "DownloadFile" with "2" argument(s): "An exception occurred during a WebClient request." At X:\test.ps1:5 char:1 + $wb.DownloadFile($url,$file) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : WebException – Sybuser Aug 14 '20 at 13:41
  • Create a Folder `C:\Test` and re-run the script ! because i tested it under a folder named c:\Test – Hackoo Aug 14 '20 at 14:00
  • ok it works inside a powershell after folder creation.. what I'm looking for is a '1-click' solution but even if I right-click 'Run with PowerShell' I'm getting an error, but even if it worked it would not be satisfying for an end-user. – Sybuser Aug 14 '20 at 14:13
  • Set-ExecutionPolicy : Windows PowerShell updated your execution policy successfully, but the setting is overridden by a policy defined at a more specific scope. Due to the override, your shell will retain its current effective execution policy of RemoteSigned. Type "Get-ExecutionPolicy -List" to view your execution policy settings. For more information please see "Get-Help Set-ExecutionPolicy". – Sybuser Aug 14 '20 at 14:14
  • At line:1 char:46 + ... -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass }; & 'U ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : PermissionDenied: (:) [Set-ExecutionPolicy], SecurityException + FullyQualifiedErrorId : ExecutionPolicyOverride,Microsoft.PowerShell.Commands.SetExecutionPolicyCommand – Sybuser Aug 14 '20 at 14:14
  • Get-ExecutionPolicy -List Scope ExecutionPolicy ----- --------------- MachinePolicy RemoteSigned UserPolicy Unrestricted Process Undefined CurrentUser Undefined LocalMachine RemoteSigned – Sybuser Aug 14 '20 at 14:16
  • @Sybuser Please chek my last edit code and tell how it works on your side ? – Hackoo Aug 14 '20 at 16:09
  • On my box i had to use [cmd.exe under admin privileges](https://stackoverflow.com/questions/67270197/) and use `powershell.exe -executionpolicy unrestricted -File fromWeb.ps1`. The file `fromWeb.ps1` contains the script from above. – surfmuggle Mar 21 '22 at 15:54
1

This worked for me :

powershell -Command "[System.Net.WebRequest]::DefaultWebProxy = [System.Net.WebRequest]::GetSystemWebProxy(); [System.Net.WebRequest]::DefaultWebProxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials; (New-Object Net.WebClient).DownloadFile('https://some.hostname/file.txt', 'file.txt')"
Sybuser
  • 735
  • 10
  • 27