我有一个脚本来获取文件夹中的所有html文件,我想得到所有md5值,这里是代码:
$Allfiles=get-childItem("*html")
Foreavch-object($Mfile in $Allfiles)
{
$Md5=calMd5($Mfile)
If($HashQueue.contains($Mfile))
{
Continue
}
Else
{Enqueue()}
}
我无法正确获取文件,如何预测目录中的每个文件?
答案 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("*html")
将工作,但它会间接和偶然地这样做。正如alroc所说,您不使用括号将参数传递给PowerShell cmdlet或函数(尽管您执行使用它们将参数传递给方法)。在大多数情况下,括号是表达式评估运算符。此命令有效的原因是("*html")
计算为字符串*html
,然后将其作为参数传递给 Get-ChildItem 。在这种情况下,括号是多余的,但在许多情况下,你会遇到麻烦将参数括在括号中,除非你打算使参数成为表达式的结果而不是括号中的括号。如果 $ HashQueue 是一个队列对象,并且您想将MD5值添加到此队列,则执行以下操作:
$HashQueue.Enqueue((calMd5 Get-Content $_ | Out-String))
但是,我认为这不是你想要做的,因为将MD5哈希排队到已经包含表示文件的FileInfo对象的队列的末尾是没有意义的({{隐含的} { 1}})。
如果这不是您想要做的,请澄清。请参阅我的评论中的问题,并尽可能具体。