1

The function I wrote here accepts three mandatory parameters: an input file, a list containing at least one hash algorithm(s), and an output file that saves the hash values of that input file. This function attempts to accept three needed parameters: input file, list of at least one hash algorithms, and output file that saves the hashed values of that input file. I am trying to complete the function by writing the code needed to efficiently and effectively implement this function in the specified block. I am attempting to implement some form of looping to access the elements in $hashAlgorithm.

function Return-FileHash { 
param ( 
[Parameter(Position=0,Mandatory=$true,ValueFromPipeline=$true)] 
[ValidateSet("SHA1","SHA256","SHA384","SHA512","MD5")] 
[STRING[]] 
# the array list that contains one or more hash algorithm input for Get-FileHash cmdlet 
$hashAlgorithm, 
[Parameter(Position=1, Mandatory=$true,ValueFromPipeline=$true)] 
# the document or executable input/InputStream for Get-FileHash cmdlet 
$filepath, 
[Parameter(Position=2,Mandatory=$true,ValueFromPipeline=$true)] 
# the output file that contains the hash values of $filepath 
$hashOutput 
) 
#============================ begin ==================== 
# Here, I am trying to use a loop expression to implement this
for( $i = 0; $i -lt $hashAlgorithm.Length; $i++)
{
Get -FileHash $hashAlgorithm -SHA1 | $hashOutput
}

# === end ================= 
Return-FileHash

I get this:

At line:19 char:38
+ Get -FileHash $hashAlgorithm -SHA1 | $hashOutput
+                                      ~~~~~~~~~~~
Expressions are only allowed as the first element of a pipeline.
At line:1 char:26
+ function Return-FileHash {
+                          ~
Missing closing '}' in statement block or type definition.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : ExpressionsMustBeFirstInPipeline

1 Answer 1

1

To access the individual elements of $hashAlgorithm in the for loop, index into it with the current value of $i:

for ( $i = 0; $i -lt $hashAlgorithm.Length; $i++) {
    Get-FileHash $filepath -Algorithm $hashAlgorithm[$i] | ...
}

Alternatively use a foreach() loop:

foreach($algo in $hashAlgorithm.Length) {
    Get-FileHash $filepath -Algorithm $algo | ...
}

To output to a file at path $hashOutput, either use the file redirection operators:

# `>` means "overwrite"
Get-FileHash $filepath -Algorithm $hashAlgorithm[$i] > $hashOutput
# `>>` means "append"
Get-FileHash $filepath -Algorithm $hashAlgorithm[$i] >> $hashOutput

Or pass $hashOutput as an argument to a command that writes the output to disk:

Get-FileHash $filepath -Algorithm $hashAlgorithm[$i] | Add-Content -Path $hashOutput
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.