2016-11-23 78 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