0

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

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

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

}

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

4

2 回答 2

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()
    }

}
于 2013-08-14T01:18:18.673 回答
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")计算出 string *html,然后将其作为参数传递给Get-ChildItem。在这种情况下,括号是多余的,但在许多情况下,将参数括在括号中会遇到麻烦,除非您打算将参数作为表达式的结果而不是逐字括号的内容。
  • 如果$HashQueue是一个队列对象并且你想将 MD5 值添加到这个队列中,你可以这样做:

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

    但是,我假设这不是您想要做的,因为将 MD5 哈希排入已经包含表示文件的 FileInfo 对象的队列末尾对我来说没有意义(由 暗示If($HashQueue.contains($Mfile)))。

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

于 2013-08-14T02:54:44.303 回答