I just needed a place to stash this and my GitHub didn’t seem appropriate. I make no guarantees that this will work and it’s only been tested on one system so far.
# Modern websites require TLS 1.2
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
#requires -RunAsAdministrator
# Let's go directly to the website and see what it lists as the current version
$BaseUri = "https://notepad-plus-plus.org"
$BasePage = Invoke-WebRequest -Uri $BaseUri -UseBasicParsing
$ChildPath = $BasePage.Links | Where-Object { $_.outerHTML -like '*Current Version*' } | Select-Object -ExpandProperty href
# Now let's go to the latest version's page and find the installer
$DownloadPageUri = $BaseUri + $ChildPath
$DownloadPage = Invoke-WebRequest -Uri $DownloadPageUri -UseBasicParsing
# Determine bit-ness of O/S and download accordingly
if ( [System.Environment]::Is64BitOperatingSystem ) {
$DownloadUrl = $DownloadPage.Links | Where-Object { $_.outerHTML -like '*npp.*.Installer.x64.exe"*' } | Select-Object -ExpandProperty href -Unique
} else {
$DownloadUrl = $DownloadPage.Links | Where-Object { $_.outerHTML -like '*npp.*.Installer.exe"*' } | Select-Object -ExpandProperty href -Unique
}
Write-Host "Downloading the latest Notepad++ to the temp folder"
Invoke-WebRequest -Uri $DownloadUrl -OutFile "$env:TEMP\$( Split-Path -Path $DownloadUrl -Leaf )" | Out-Null
Write-Host "Installing the latest Notepad++"
Start-Process -FilePath "$env:TEMP\$( Split-Path -Path $DownloadUrl -Leaf )" -ArgumentList "/S" -Wait
I added the -Unique flag to the end of the download URL detection as indicated in a below message. (Again, nice catch!)
perfect
It downloaded the notepad++ installer in an AWS EC2 instance running Windows Server 2019. It didn’t start the installer automatically, but download was good enough for me.
Thanks Mauro. I wasn’t able to reproduce in my own environment, but that doesn’t mean it’s outside the realm of possibility.
i ended up doing this.. it installs the latest one 64 bit
$LocalTempDir = $env:TEMP
$href = ((Invoke-WebRequest -Uri ‘https://notepad-plus-plus.org/downloads/’).Links | Where-Object { $_.innerText -match ‘current version’ }).href
$downloadUrl = ((Invoke-WebRequest “https://notepad-plus-plus.org/$href”).Links | Where-Object { $_.innerHTML -match ‘installer’ -and $_.href -match ‘x64.exe’ }).href
Invoke-RestMethod $downloadUrl -OutFile “$LocalTempDir/np++.exe”
start-process -FilePath “$LocalTempDir\np++.exe” -ArgumentList ‘/S’ -Verb runas -Wait
And updated version in case you want to update existing NotePad++ installed
$w64=Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | where-Object DisplayName -like ‘NotePad++*’
$w32=Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | where-Object DisplayName -like ‘NotePad++*’
Write-Output “Before::::”
if ($w64) {
write-Host $w64.DisplayVersion
} elseif ($w32) {
write-Host $w32.DisplayVersion
} else {
Write-Output “No Version Found”
}
# Modern websites require TLS 1.2
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
# requires -RunAsAdministrator
# Let’s go directly to the website and see what it lists as the current version
$BaseUri = “https://notepad-plus-plus.org”
$BasePage = Invoke-WebRequest -Uri $BaseUri -UseBasicParsing
$ChildPath = $BasePage.Links | Where-Object { $_.outerHTML -like ‘*Current Version*’ } | Select-Object -ExpandProperty href
# Now let’s go to the latest version’s page and find the installer
$DownloadPageUri = $BaseUri + $ChildPath
$DownloadPage = Invoke-WebRequest -Uri $DownloadPageUri -UseBasicParsing
# Determine bit-ness of O/S and download accordingly
if ( [System.Environment]::Is64BitOperatingSystem ) {
if (Test-Path (“C:\Program Files\Notepad++”)){
$DownloadUrl = $DownloadPage.Links | Where-Object { $_.outerHTML -like ‘*npp.*.Installer.x64.exe”*’ } | Select-Object -ExpandProperty href
}else {
if (Test-Path (“C:\Program Files (x86)\Notepad++”)){
$DownloadUrl = $DownloadPage.Links | Where-Object { $_.outerHTML -like ‘*npp.*.Installer.exe”*’ } | Select-Object -ExpandProperty href
}
}
}
#Fix when it get 2 lines of the same URL
$DownloadUrl = $DownloadUrl[0]
If ($DownloadUrl -ne $null){
Write-Host “Downloading the latest Notepad++ to the temp folder”
Invoke-WebRequest -Uri $DownloadUrl -OutFile “$env:TEMP\$( Split-Path -Path $DownloadUrl -Leaf )” | Out-Null
Write-Host “Installing the latest Notepad++”
Start-Process -FilePath “$env:TEMP\$( Split-Path -Path $DownloadUrl -Leaf )” -ArgumentList “/S” -Wait
}
$w64=Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | where-Object DisplayName -like ‘NotePad++*’
$w32=Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | where-Object DisplayName -like ‘NotePad++*’
Write-Output “After::::”
if ($w64) {
write-Host $w64.DisplayVersion
} elseif ($w32) {
write-Host $w32.DisplayVersion
} else {
Write-Output “No Version Found”
}
I dig it – but for me (in my scenarios), I let the internal update checker do the work for me.
You mixed up the 64 bit and 32 bit. 32 bit would be installed in the Wow64 location.
Didn’t work for me:
Invoke-WebRequest : Cannot convert ‘System.Object[]’ to the type ‘System.Uri’ required by parameter ‘Uri’. Specified method is not
supported.
At line:20 char:24
+ Invoke-WebRequest -Uri $DownloadUrl -OutFile “$env:TEMP\$( Split-Path …
+ ~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Invoke-WebRequest], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
Installing the latest Notepad++
Start-Process : This command cannot be run due to the error: The system cannot find the file specified.
At line:22 char:1
+ Start-Process -FilePath “$env:TEMP\$( Split-Path -Path $DownloadUrl – …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [Start-Process], InvalidOperationException
+ FullyQualifiedErrorId : InvalidOperationException,Microsoft.PowerShell.Commands.StartProcessCommand
On my end, on a fresh WS2019 install, I had to add the “-Unique” flag on the Select-Object statement at line 15 & 17 to ensure only one line was returned, then it installed like a charm.
Otherwise:
PS C:\Users\Administrator\Desktop> $DownloadUrl
https://github.com/notepad-plus-plus/notepad-plus-plus/releases/download/v8.4.4/npp.8.4.4.Installer.x64.exe
https://github.com/notepad-plus-plus/notepad-plus-plus/releases/download/v8.4.4/npp.8.4.4.Installer.x64.exe
Thanks! 🙂
Nice catch Philippe – This script kind of gets borked whenever they decide to change the web page layouts. That is a solid catch, my man.
It worked great for me, is there a way to also install some plugins silently over PS?
Not any simple way I’ve been able to find. There might be a way buried in the executable for Notepad++, but I haven’t taken the time to truly dig in.
# Modern websites require TLS 1.2
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
# Check if Notepad++ is running and close it if it is
$notepadProcess = Get-Process -Name “notepad++” -ErrorAction SilentlyContinue
if ($notepadProcess) {
Write-Host “Closing Notepad++”
Stop-Process -Name “notepad++” -Force
}
#requires -RunAsAdministrator
# Let’s go directly to the website and see what it lists as the current version
$BaseUri = “https://notepad-plus-plus.org”
$BasePage = Invoke-WebRequest -Uri $BaseUri -UseBasicParsing
$ChildPath = $BasePage.Links | Where-Object { $_.outerHTML -like ‘*Current Version*’ } | Select-Object -ExpandProperty href
# Now let’s go to the latest version’s page and find the installer
$DownloadPageUri = $BaseUri + $ChildPath
$DownloadPage = Invoke-WebRequest -Uri $DownloadPageUri -UseBasicParsing
# Determine bit-ness of O/S and download accordingly
if ( [System.Environment]::Is64BitOperatingSystem ) {
$DownloadUrl = $DownloadPage.Links | Where-Object { $_.outerHTML -like ‘*npp.*.Installer.x64.exe”*’ } | Select-Object -ExpandProperty href -Unique
} else {
$DownloadUrl = $DownloadPage.Links | Where-Object { $_.outerHTML -like ‘*npp.*.Installer.exe”*’ } | Select-Object -ExpandProperty href -Unique
}
# Extract version from the download URL
$Version = $DownloadUrl -replace ‘.*npp.([0-9.]+)\.Installer.*’, ‘$1’
Write-Host “Downloading Notepad++ version $Version to the temp folder”
Invoke-WebRequest -Uri $DownloadUrl -OutFile “$env:TEMP\$( Split-Path -Path $DownloadUrl -Leaf )” | Out-Null
Write-Host “Installing Notepad++ version $Version”
Start-Process -FilePath “$env:TEMP\$( Split-Path -Path $DownloadUrl -Leaf )” -ArgumentList “/S” -Wait