循环遍历子目录和(1)将文件复制到另一个目录(2)将它们重命名为md5哈希

时间:2015-07-09 12:59:13

标签: powershell powershell-v2.0

考虑以下目录结构:

rootdir
  subdir_1
     12345.tif
     56789.tif
  subdir_2
     00000.tif
  ...
  subdir_n
     99999.tif
     54321.tif
     54345.tif

我需要:

  1. 循环遍历此结构
  2. 计算每个tif文件的md5
  3. 将[md5.tif]复制到另一个文件夹(忽略文件夹结构)。
  4. 所以期望的输出是:

    newdir
       2070e4cfb8f24209647d3c9ec55098ee.tif
       52e31fe630cebe73cc959d371bd6b353.tif
       eec032f144f5af1be2b7f0535a2010d2.tif
       936ed95431293660e3499d88e5ae22b0.tif
       8bc884dce30d89b53b120adb8bd658b2.tif
       ec87470ae6683b539ea69004894e23dd.tif
    

    我现在(在公元前PS 2.0中,我必须与之合作):

    Get-ChildItem "D:\rootdir" -filter *.tif |
      Foreach-Object {
        $content = Get-Content $_.FullName
        $md5     = New-Object -TypeName  
    
        System.Security.Cryptography.MD5CryptoServiceProvider
        $hash = [System.BitConverter]::ToString($md5.ComputeHash([System.IO.File]::ReadAllBytes($content)))
    
        ## Write-Host $hash = CB-A9-EB-00-92-18-06-71-D9-DD-7C-2A-08-D9-D9-EF
    
        Set-Content $_.FullName('newroot/'+ $hash +'.tif')
    }
    

    这里的第一个问题是MD5之间有-。那么我在这里做错了什么?

    其次,为什么新文件没有写入文件系统?

    非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

首先,这些破折号是.Context的结果。如果需要,您可以删除它们。其次,如果您要复制文件,则应拨打[System.BitConverter]::ToString()而不是Copy-Item。像这样:

Set-Content