2016-11-23 64 views
1

被稱爲我有這樣的字典:Powershell的:含有功能哈希表與參數

function HashHandlerSHA256 
{ 
    param($Path, $Checksum) 

    $csp = new-object -TypeName System.Security.Cryptography.SHA256CryptoServiceProvider 
    $ComputedHash = $csp.ComputeHash([System.IO.File]::ReadAllBytes($Path)) 
    $ComputedHash = [System.BitConverter]::ToString($ComputedHash).Replace("-", "").ToLower() 

    $result = $ComputedHash.CompareTo($Checksum) 

    return $result -eq 0 
} 

$HashHandler = @{"SHA256" = HashHandlerSHA256} 

含有驗證算法和功能被調用以進行驗證。這些函數應該都具有相同的參數和返回類型。

現在,當我有:

$Checksums = @{"SHA256" = "..."} 

我想打電話,這取決於算法和值我擁有正確的功能。在這種情況下,我會有一個有效的sha256散列。

現在我想做的事:

function Validate 
{ 
    param($Path, $Checksums) 

    foreach($Hash in $Checksums) { 
     $Type = $Hash.Name 
     $Value = $Hash.Value 

     if ($HashHandler.ContainsKey($Type)) { 
      $Handler = $HashHandler.Get_Item($Type) 
      if (-Not ($Handler -Path $Path -Checksum $Value)) { 
       return $FALSE 
      } 
     } 
    } 

    return $TRUE 
} 

我得到的errormessage的是:

At C:\Users\username\Desktop\hashtest.ps1:27 char:23 
+    if (-Not ($Handler -Path $Path -Checksum $Value)) { 
+        ~~~~~ 
Unexpected token '-Path' in expression or statement. 

我是比較新的PowerShell的。我知道如何使用參數調用函數,但是當存儲在一個變量中時,我沒有設法解決這個問題,當在網上搜索時,我沒有得到我需要的答案。

感謝您的幫助。

回答

1

如果我理解你想是這樣的

function HashHandlerSHA256 
{ 
    param($Path, $Checksum) 

    $csp = new-object -TypeName System.Security.Cryptography.SHA256CryptoServiceProvider 
    $ComputedHash = $csp.ComputeHash([System.IO.File]::ReadAllBytes($Path)) 
    $ComputedHash = [System.BitConverter]::ToString($ComputedHash).Replace("-", "").ToLower() 
    $result = $ComputedHash.CompareTo($Checksum) 

    return $result -eq 0 
} 

function Validate 
{ 
    param($Path, $Checksums) 

     foreach($Hashkey in $Checksums.Keys) 
     { 
      $Value = $Checksums[$Hashkey] 

      if ($script:HashHandler.ContainsKey($Hashkey)) 
      { 
       if (-Not (&$script:HashHandler[$Hashkey] -Path $Path -Checksum $Value)) { return $false} 
      } 
     } 

    return $TRUE 
} 


#add here your couples of algo/function 
$script:HashHandler = @{"SHA256" = 'HashHandlerSHA256'} 

#checksum to test 
[email protected]{} 
$Checksums["SHA256"]= 'd6a0a09fb1a7971b497674675d5b5621d865d6020e384137548de9c4ac6d4994' 
$Checksums["MD5"]= 'xxxx' 

#test list checksum and algo 
Validate -Path "c:\temp\hello.csv" -Checksums $Checksums 

的其他解決方案

$file="C:\temp\exludevalue.txt" 
[email protected]{} 
$Checksums["SHA256"]= 'd6a0a09fb1a7971b497674675d5b5621d865d6020e384137548de9c4ac6d4994' 
$Checksums["MD5k"]= '11A8D99F80F9B29FCF6A995D2F17B2E3' 

$Checksums.Keys | 
%{ 
    if ($(gcm Get-FileHash).Parameters.Algorithm.Attributes.ValidValues -contains $_) 
    { 
     $algocalc=(Get-FileHash -path $file -Algorithm $_).Hash; 
    } 
    else 
    { 
     $algocalc='ALGO NOT FOUNDED' 
    } 

    new-object psobject -Property @{ 
         Algo=$_ 
         OldValue=$Checksums[$_] 
         CalculedValue=$algocalc 
         ResultComparison= $algocalc -eq $Checksums[$_] 
         } 
} 
+0

真棒。我使用了第一個,因爲我不能依賴Get-FileHash,因爲我可能擁有諸如PGP和openSSL簽名之類的東西。非常精確的例子幫助我學習了一些新的東西。非常感謝! – Silberling

+0

在一個例子中,我嘗試使用函數本身作爲has表中的值。當調用$ x.F時,F是關鍵,函數被調用。我知道我需要函數作爲字符串和調用操作符能夠調用一個函數的參數,但沒有,我可以推動該函數本身? – Silberling