PowerShell预先处理所有文件并计算每个md5值

时间:2013-08-14 01:04:43

标签: powershell

我有一个脚本来获取文件夹中的所有html文件,我想得到所有md5值,这里是代码:

$Allfiles=get-childItem("*html")
Foreavch-object($Mfile in $Allfiles)
{
    $Md5=calMd5($Mfile)

    If($HashQueue.contains($Mfile))
    {
        Continue 
    }
    Else 
    {Enqueue()}

}

我无法正确获取文件,如何预测目录中的每个文件?

2 个答案:

答案 0 :(得分:2)

在PowerShell中调用函数或cmdlet时,从不使用括号。

您的foreach-object也有拼写错误(请注意代码中的v)。

calMd5期待什么作为参数?文件名?文件的完整路径?一个东西?您对$HashQueue所投入的内容也有同样的问题。

假设calMd5可以获取文件的路径,那就是您要放入$HashQueue的内容:

$Allfiles = get-childItem -filter *html
Foreach-object($Mfile in $Allfiles)
{
    $Md5 = calMd5 $Mfile.FullName

    If(!$HashQueue.contains($Mfile.FullName))
    {
        Enqueue()
    }

}

答案 1 :(得分:1)

目前还不是很清楚你要做什么,但我要推断你想要这样的东西:

$MD5Hashes = @{}
Get-ChildItem *.html | %{
  $MD5Hashes.Add($_.Name, (calMd5 Get-Content $_ | Out-String)
}

此代码创建文件的MD5哈希的哈希表,键入文件名,假设 calMd5 函数采用字符串参数。您可以在MD5哈希中查找如下文件:$MD5Hashes.'filename'。或者如果您在变量中包含文件名,例如:$MD5Hashes."$filename"

一些注意事项:

  • Get-ChildItem 的结果分配给变量并使用 Foreach-Object 进行迭代是多余的。只需将结果传递给 Foreach-Object 块(%{} Foreach-Object 的简写)。对象管道是PowerShell设计的核心功能之一。你会学会爱他们。
  • 虽然Get-ChildItem("*html") 工作,但它会间接和偶然地这样做。正如alroc所说,您不使用括号将参数传递给PowerShell cmdlet或函数(尽管您执行使用它们将参数传递给方法)。在大多数情况下,括号是表达式评估运算符。此命令有效的原因是("*html")计算为字符串*html,然后将其作为参数传递给 Get-ChildItem 。在这种情况下,括号是多余的,但在许多情况下,你会遇到麻烦将参数括在括号中,除非你打算使参数成为表达式的结果而不是括号中的括号。
  • 如果 $ HashQueue 是一个队列对象,并且您想将MD5值添加到此队列,则执行以下操作:

    $HashQueue.Enqueue((calMd5 Get-Content $_ | Out-String))

    但是,我认为这不是你想要做的,因为将MD5哈希排队到已经包含表示文件的FileInfo对象的队列的末尾是没有意义的({{隐含的} { 1}})。

如果这不是您想要做的,请澄清。请参阅我的评论中的问题,并尽可能具体。