【问题标题】:Search files and Generate MD5 Hash value搜索文件并生成 MD5 哈希值
【发布时间】:2014-09-02 07:14:54
【问题描述】:

大家好,我在搜索和生成文件的哈希值时遇到了问题。我面临的问题是在编写其输出时 到 Out.txt 文件中。我想写两个文件 Data1.txt 和 SqlData.txt 的输出结果,但不幸的是它会擦除第一个文件输出并保存最后一个文件输出结果,即 SqlData.txt 值下面是用于理解代码的简短代码描述

#File1.txt 文件包含我要搜索的两个文件 Data1.txt 和 SqlData.txt 的列表 #Dir1.txt 文件包含我要在其中搜索 $arr 输出文件的目录 (C:) 路径

到目前为止我尝试过的代码。

cls
$arr = Get-ChildItem -Path "C:\Direct\File1.txt"  
$d = Get-Content $arr
Foreach ($objFile in $d) {
$c = $objFile.Name
$a = Get-Content "C:\Direct\Dir1.txt" 
$e = Get-ChildItem -Path $a -Filter $objFile -Recurse  -Force -ErrorVariable FailedItems -ErrorAction SilentlyContinue # Searching the Files
$k = Get-Hash $e >  C:\Direct\Reverse\Out.txt #Fetching the Hash value of files and writing output into Out.txt file
} 

如果有什么不清楚的地方请告诉我,并帮助我解决这个问题。 谢谢

【问题讨论】:

  • 你可以使用管道而不是使用>Get-Hash e$ | Out-file C:\Direct\Reverse\Out.txt -Append Append 应该阻止它覆盖它已经存在的内容。
  • @Matt yes File1.txt 包含文件名列表而不是完整文件路径
  • 所以您正在 C: 驱动器中搜索文件 Data1.txtSqlData.txt 并将这两个文件的哈希输出到 out.txt?
  • 是的,包括文件名和路径

标签: powershell


【解决方案1】:
$searchPath = Get-Content "C:\Direct\Dir1.txt" 
Get-Content -Path "C:\Direct\File1.txt" | ForEach-Object{
    # For each line in the file. Create a custom object that contains all the needed data.
    $theFile = Get-ChildItem -Path $_ -Filter $searchPath  -Recurse  -Force -ErrorVariable FailedItems -ErrorAction SilentlyContinue
    [pscustomobject] @{
        'File Name' = $_
        'Path' = $theFile.DirectoryName
        'Hash'= Get-Hash $theFile
    }
} | ConvertTo-Csv -notypeinformation | Out-File C:\Direct\Reverse\Out.txt -Append
  1. $searchPath 获取您所说的 c:\。如果这就是它所包含的全部,那么你真的不需要它。但我可以在路上看到其他搜索,所以我按要求离开了。这只需要调用一次,所以我将它从ForEach 循环中取出。
  2. 我们得到文件的内容,它应该是单个文件的列表。
  3. 对于每个文件名,我们搜索$searchPath我认为我们可以使 Get-ChildItem 调用更好。我需要对此进行调查。
  4. 创建一个包含我们需要的所有详细信息的自定义对象。
  5. 将自定义对象转换为 csv 实体,以便输出干净。
  6. 将这些自定义对象归档。我们使用-Append 来确保它不会覆盖任何细节。

注意事项 我只是为了弄湿你的口哨。 我需要得到Get-Hash,因为我没有它,所以我无法正确测试它。我将无法很快更新到 4.0。 这不会进行任何错误检查,即。如果文件存在。我建议在任何生产脚本中这样做。

【讨论】:

  • 我在运行上述脚本时遇到此错误。术语“For-EachObject”未被识别为 cmd let、函数、脚本文件或可运行程序的名称。然而,我提到的脚本在添加 Pipe 而不是 > 后按预期工作,但现在我面临另一个问题,即在将结果导出到 Out.txt 文件时,我试图将结果保存在分离的文件名中,我我在开始处使用以下代码获取 $arr = Get-ChildItem -Path "C:\Direct*.txt"
  • 哦,好的。第一个错误是由于拼写错误。实际上是ForEach-Object。我会尽我所能纳入您的最后评论。
  • 现在知道$c = $objFile.Name 的用途是什么了。您不能只使用原始示例中的C:\Direct\Reverse\c$ 吗?
猜你喜欢
  • 2021-09-27
  • 1970-01-01
  • 2013-09-08
  • 1970-01-01
  • 1970-01-01
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
相关资源
最近更新 更多