I am trying to create a PS script that compares the hash of a file after download to ensure integrity. I want to make it user friendly, something I can stick in our RMM tool set so lower tier technicians can utilize it. I originally wanted to create variables like:
$1 = SHA1
$2 = SHA256
$3 = SHA384
$4 = SHA512
$5 = MD5
but I get the following message:
The term ‘SHA1’ is not recognized as the name of a cmdlet, function,
| script file, or operable program. Check the spelling of the name, or
| if a path was included, verify that the path is correct and try again.
When I try the variable as a string
$1 = "SHA1"
$2 = "SHA256"
$3 = "SHA384"
$4 = "SHA512"
$5 = "MD5"
There is no error message. I figured this is because I am trying to define something already defined, or alpha numeric variables are not allowed. I am not asking for this to be done for me, just to be pointed in the right direction so I can accomplish the following actions:
- User is prompted for a value 1-5, each representing an Algorithm
- User provides file path
- User inserts hash comparison
- User is presented with a Boolean value stating if there is a match or not
I am an aspiring DevOps IT, I am admittedly new to robust scripting but I catch on quick. I have some experience programming with full stack environments. Any advise would be greatly appreciated.
Hello NinemmRx,
When you are initializing variables the 1st time PowerShell treats values after = as cmdlets not variable values. The error message states exactly that.
When you are doing it 2nd time you are initializing 5 string variables.
Reference: about_Variables
Hope that helps.
As Andy has said, without qoutes Powershell believes you are calling a command. Here are a couple of better approaches as well:
Array and Indexes:
$algorithm = 'SHA1','SHA256','SHA384','SHA512','MD5'
$algorithm | foreach{'({0}) - {1}' -f ($algorithm.IndexOf($_) + 1), $_}
$choice = Read-Host 'Choose a number (1-5) of the algorithm to use'
Get-FileHash -Path C:\Scripts\random.txt -Algorithm $algorithm[$choice - 1]
Hash Table:
$algorithm = [ordered]@{
1 = 'SHA1'
2 = 'SHA256'
3 = 'SHA384'
4 = 'SHA512'
5 = 'MD5'
}
$algorithm.GetEnumerator() | foreach {'({0}) - {1}' -f $_.Key, $_.Value}
$choice = Read-Host 'Choose a number (1-5) of the algorithm to use'
Get-FileHash -Path C:\Scripts\random.txt -Algorithm $algorithm.Item(2)