Press "Enter" to skip to content

Category: Life: Work and Techy

Techy: Microsoft PowerShell and Linux Commands

I’m finding myself mix and matching between GNU/Linux and Microsoft PowerShell quite a bit at the moment and which most Linuxy/Linuxesque (?) commands work fine under PowerShell, some are a little bit different.

Here’s a few which may be handy to know (the only order is that which I entered them). I’ve also added a couple of Windows commands where they are slightly easier to remember/shorter than PowerShell – and, me being me, included links to the appropriate documentation where possible.

Linux CommandPowerShell CommandDescription
which <commandname>
which composer
GNU Logo GNU “which”
Get-Command <commandname>
Get-Command composer
Powershell Logo PowerShell “Getting Environment Variables”
Find the location of an executable called <commandname>
In PowerShell, Get-Command can be referred to as just “gcm” so the example would become “gcm composer
GNU Logo GNU “printenv”
Get-Item -Path Env:
Powershell Logo PowerShell “Getting Environment Variables”
List all environment variables.
PowerShell also supports using “ls” to list environment variables – such as “ls env:
HELLO="you guys"
Set-Item -Path Env:<variablename> "<value>"
Set-Item -Path Env:HELLO "you guys"
Powershell Logo PowerShell: “Change the value of an environment variable”
Sets an environment variable called <variablename> to the text <value>

PowerShell also supports using “$env:<variablename>="<value>” ” – such as ” $env:HELLO="you guys"
echo $<variablename>
echo $PATH
GNU Logo GNU “echo”
Get-ChildItem -Path Env:<variablename>
Get-ChildItem -Path Env:PATH
Powershell Logo PowerShell “Get A Selected Environment Variable”
Show the value of an environment variable called <variablename>
PowerShell also supports using “ls” to list environment variables – such as “ls env:PATH

echo <text>
echo "Hello there!"

GNU Logo GNU “echo”
Write-Output <text>
Write-Output "Hello there!"
Powershell Logo PowerShell “Write-Output”
Displays/prints a <text> string to the terminal
grep "<string>" <file>
grep "sort code" document.txt
GNU Logo GNU “grep”
Select-String "<string>" <file>
Select-String “sort code” document.txt
Powershell Logo PowerShell “Select-String”
Search a file <file> for the given text <string> using a regular expression

grep "<string>" <file>
grep "sort code" document.txt
GNU Logo GNU “grep”
findstr /R "<string>" <file>
findstr /R "sort code" document.txt
Windows LogoWindows Command: “findstr”
Search a file <file> for the given text <string> using a regular expression

ls | grep "<string>"
ls | grep "\.html"
GNU Logo GNU “ls”
ls | Out-String -Stream | Select-String "<string>"
ls | Out-String -Stream | Select-String “\.html”
Powershell Logo PowerShell “Select- String: Convert Pipline Objects”
Search a directory listing for a filename containing <string> using a regular expression
ls | grep "<string>"
ls | grep "\.html"
GNU Logo GNU “ls”
dir | findstr /R "<string>"
dir | findstr /R "\.html"
Windows LogoWindows Command: “findstr”
Search a directory listing for a filename containing <string> using a regular expression.
wget <url> --output-document <filename>
wget https://h.tld/f.gif --output-document o.gif
GNU Logo GNU “wget”
Invoke-WebRequest <url> -OutFile <filename>
Invoke-WebRequest https://h.tld/f.gif -OutFile o.gif
Powershell Logo PowerShell “Invoke-WebRequest”
Save a file at a URL <url> as a local file called <filename>
a \
GNU Logo GNU “The Backslash Character”

Powershell Logo PowerShell “…Line Continuation in Code…”
Allows a command to be split across multiple lines using the multiline separator/line continuation character.
echo "A" && echo "B"
GNU Logo GNU “Lists
Write-Output "A "&& Write-Output "B"
Powershell Logo PowerShell “Pipeline Chain Operators”
Command chaining using pipeline operators/list operators – if the condition on the left is true/passes, then continue.
rm <file>
rm test.tmp
GNU Logo GNU “rm”
Remove-Item <file>
Remove-Item test.tmp
Powershell Logo PowerShell “Remove-Item”
Deletes a file called <file>
unzip <file>
Expand-Archive <file>
Powershell Logo PowerShell “Expand-Archive”
Extracts a .zip archive file
uname -nrmo
GNU Logo GNU “uname”
(note, the output order of uname in GNU/Linux cannot be altered)
Get-ComputerInfo -Property CsDNSHostName, OsVersion, OsArchitecture, OsName | ConvertTo-Json
Powershell Logo PowerShell “Get- ComputerInfo”
Powershell Logo PowerShell “ConvertTo-Json”
Gets basic information about the system. For example:
Computer’s “hostname”
[GNU:n PS: CsDNSHostName]
OS or kernel release
[GNU: r PS:OsVersion]
Machine/Processor type
[GNU:m PS:OsArchitecture]
Operating system (OS) name
[GNU:o PS: OsName]
These commands were testing on a Debian bullseye Linux virtual machine and using Microsoft PowerShell 7.2 on Windows 10.

Microsoft PowerShell – don’t you mean Windows PowerShell?


If you have a Windows 11, 10, 8.1, 8.0 or 7 machine, it would have come “with default” with Windows PowerShell – however, Microsoft has replaced that with a new “multiplatform” version which – in their infinite wisdom – have decided to call Microsoft PowerShell but haven’t “forcibly upgraded” people (you can upgrade yourself via their “Installing PowerShell on Windows” guide).

Microsoft do have a webpage about the differences between the PowerShells if you want to read: but if you use the command line a lot, it might be worth looking at Windows Terminal as well.

Which version of PowerShell do I have?

If you type/copy:


into the shell, you’ll get:

  • A “Major” version number of 7 or above = (new) Microsoft PowerShell
  • A “Major” version number of 5 or lower = (old) Windows PowerShell
  • A “Major” version number of 6 = I don’t think this actually exists and therefore should be used as the “cut-off” point between the two.
  • “.Version was unexpected at this time” = Probably using Windows Command Prompt
  • “-ash: syntax error: unexpected word” = You are in a shell of a Linux machine!
  • “bash: syntax error unexpected token `.Version’ = Linux again!

Real Life Example

As an example, here’s a single line Linux “command script” which uses curl to fetch a page from https://api.example/latest , parse it for the first occurrence of the text:


(where v…. is any sequence of characters starting with “v” and ending with a quote mark) and store that as $VERSION then pass that to curl again to download that specific version zip file from${VERSION}.zip as “” (replacing ${VERSION} with the extracted version number), unzip it and then delete the downloaded .zip file.

And, yes, I’ve colour coded the appropriate sections so you can see which command “maps” to which other command.

Linux Example

 curl --silent "" | \
 grep '"tag_name":' | \
 sed -E 's/.*"v([^"]+)".*/\1/' \
) && curl -L${VERSION}.zip -o \
&& unzip && rm

Windows PowerShell 7 Example

if (((Invoke-WebRequest "").Content) -match '"tag_name":"v(?<ver>[^"]+)"') {
$VERSION=$Matches.ver &&
Invoke-WebRequest "${VERSION}.zip" -OutFile &&
Expand-Archive && Remove-Item }

Techy: Nixstats And Cloudflare – Allowing IPs

What is NixStats?

I’m currently trying the NixStats (affiliate link) monitoring tool for servers and websites – mainly because it’s cheap (starts at $0/month for 5 monitors and 1 server, $9.95/month for 10 servers and 25 web monitors) and partially because it’s owned by WebPros. Not heard of WebPros? Me neither until I went digging and found out that not only do they now own NixStats but also cPanel Inc and Plesk (both “rivals” in the web hosting control panel world) – along with a few others(!)

The Problem – Cloudflare’s security being triggered

Anyway – one of the sites I am monitoring using Nixstats is under the Cloudflare system – and because of the frequent monitoring, it may “trip up” Cloudflare’s security features so I needed to “allow list” (aka “white list”) the IP addresses used by NixStats. Luckily, they do provide a list at and (I’ve got no idea how often these are updated though) – but you can’t simply import these into Cloudflare due to two issues:

  1. One of the IP addresses (in the first list) has a trailing tab character which Cloudflare just rejects as being an invalid IP address. Took me a while to find that!
  2. The IPv6 addresses are not in a format that Cloudflare accepts – they only accept CIDR’d IPv6 address on a /64 or smaller (and if you are not that techy, you are forgiven for not understanding that!).

The solution

So I’ve put together a downloadable CSV file listing all those IP addresses in the “correct format” for you to easily import into Cloudflare’s lists (Cloudflare don’t have an export option šŸ™ ).

You can download the file from here but I give no guarantee of accuracy etc etc.

But where in Cloudflare do I use the file?

It’s a two stage operation – first you’ve got to create the list and then you’ve got to setup the firewall rules.

Creating the IP Address List in Cloudflare

  1. Log into your Cloudflare account and get onto the main account screen (i.e. where it lists your individual sites)
  2. On the left hand menu near the bottom, there is an option labelled “Manage Account” – expand that.
  3. Under “Manage Account”, select “Configurations”
  4. On the “Configurations” screen, select “Lists”
  5. Select “Create new list” (free Cloudflare accounts can only create a single list by the way)
  6. Create the list with a name such as “nixstats” and a “Content type” of “IP Addresses”
  7. Edit the list and select “Add items”
  8. Select “Upload CSV” and upload the CSV of IP addresses ,
  9. Click “Add to list” and it should load them into the list.

Setting Cloudflare to use the list

  1. Log into Cloudflare (or, if you are already logged in, click the Cloudflare logo in the top left to return to home)
  2. Select the account of the domain name you are monitoring
  3. In the left hand menu, expand “Security”
  4. Under “Security”, select “WAF” (Web Application Firewall)
  5. Under “Firewall rules” (free accounts get 5 active firewall rules), select “Create firewall rule”
  6. Set a “Rule name” of something like “nixstats”
  7. Under the “When incoming requests match…” heading use the following settings
    • Field: “IP Source Address”
    • Operator: “is in list”
    • Value: “nixstats” (i.e. the list you created above)
  8. Under “Then…” select “Allow”
  9. Click “Deploy firewall rule” and it should take affect.

You’ll need to do this for each account you are monitoring using nixstats.

Getting Mailvelope working on Brave Browser

For the last few years, I’ve been using Brave as my primary web browser due to its advert and tracking blocking abilities – extremely useful on YouTube! It’s based on Chromium (like Google Chrome and Microsoft Edge), but more privacy/anti-ad orientated.

I’ve also been wanting to GPG/PGP sign some emails using my web based email clients so I’ve installed the Mailvelope plugin from the Google Chrome store and in conjunction with GPG4Win it means I should have access to all the PGP and GPG keys stored on my Windows 10 machine… Except it doesn’t work – it fails to list any installed keys… Why?

Well, it all comes down to a Chrome based protocol called NativeMessaging which requires software (such as GPG4Win) to registered their “acknowledgement” of browser plugins such as Mailvelope by adding (in the case of Windows) various registry settings for the browser to read and interlink.

In the case of Brave, it appears the others of GPG4Win aren’t (currently) aware of it and so don’t set the various registry settings for it to work correctly – and Brave, unlike Microsoft Edge, has no “fall back” facilities to check other browsers for their Native messaging setup. I have reported this to both the Brave Community and to GnuPG (the maintainers of GPG4Win) on their bug tracker – including suggested fixes for both organisations, but it may be some time before this is fixed. So what can you do in the meantime?

Easiest way:

If trust running random commands on your computer, run the following two commands in an escalated permissions (“Run as Administrator”) Windows Command Prompt to copy the existing settings from Chrome over:

REG COPY "HKCU\Software\Google\Chrome\NativeMessagingHosts\gpgmejson" "HKCU\Software\BraveSoftware\Brave-Browser\NativeMessagingHosts\gpgmejson" /s
REG COPY "HKLM\Software\Google\Chrome\NativeMessagingHosts\gpgmejson" "HKLM\Software\BraveSoftware\Brave-Browser\NativeMessagingHosts\gpgmejson" /s

Restart Brave and all should be working.

Manual way

Add/Set the following registry key:

Path: HKEY_CURRENT_USER\Software\BraveSoftware\Brave-Browser\NativeMessagingHosts\gpgmejson
Type: Reg_SZ
Data: C:\Program Files (x86)\Gpg4win\bin\gpgme-chrome.json

(updating the “Data” path to where you’ve installed Gpg4Win as appropriate)

Restart Brave and all should be working.

iPhone Windows 10 Microsoft Store Firmware location

I’ve just been trying to recover an old iPhone 5s which is stuck in recovery (DFU) mode and whilst I haven’t yet had any luck getting beyond the Apple logo yet, I hope the following information may help others.

I installed iTunes on my Windows 10 Professional machine using the Microsoft Store (which now appears to be the preferred way Apple is distributing it) and I connected it up, it saw the iPhone and downloaded the 2.9Gb firmware. I did then try a few other applications to try and fix the Apple iPhone but they needed the firmware – but where was it on my machine?

A few sites suggested checkingĀ C:\Users\<Username>\AppData\Roaming\Apple Computer\iTunesĀ – but that path was empty for me. However, using Windows 10’s resource monitor, I soon spotted the firmware file was atĀ C:\Users\<Username>\AppData\Local\Packages\AppleInc.iTunes_nzyj5cx40ttqa\LocalCache\Roaming\Apple Computer\iTunes\iPhone Software Updates\iPhone_4.0_64bit_12.4.7_16G192_Restore.ipsw

I suspect the name of the “Package” may differ between iTunes versions, but that should help guide you to the iPhone IPSW firmware file (which I could have also downloaded from – but “guessing” that URL might have been tricky).