powershell - 复制项目创建空文件夹

powershell - Copy-Item creates empty folder

我想将一堆 jpg/gif 开头名称的文件复制到另一个位置。它没有按预期工作。它创建保持空的附加文件夹并且不复制所有子文件夹。然后我 运行 再次遍历整个路径并删除所有空文件夹。

如何防止 Copy-Item 创建额外的空文件夹?我想用一个新的根保留当前路径,并添加一个新的子目录,其中包含文件名的起始字母,并将所有文件放在那里。

当前文件夹结构

F:\pics161310
|
-----> K001
  | 
  ------> 0494434-002394
  ------> 0494434-002394
.
.
------> K0073

需要文件夹结构

C:\test161310
|
-----> K001
  | 
  ------> 0494434-002394
     |
     ----> K-G
     ----> K-F
     .
     .
  ------> 0494434-002394
     |
     ----> K-G
     ----> K-F
     .
     .
.
.
------> K0073

这是我的代码

$source = "F:\pics161310"
$destination = "C:\test" 
$folder = "K-G\"
$filterKG = [regex] "^K-G.*\.(jpg|gif)"

$bin = Get-ChildItem -Exclude $folder -Path $source -Recurse | Where-Object {($_.Name -match $filterKG) -or ($_.PSIsContainer)}

foreach ($item in $bin){
$new_folder = $item.FullName.ToString().Replace($source,$destination).Replace($item.Name,$folder)

if(-not (Test-Path $new_folder)){
    New-Item -Type dir $new_folder
    Write-Host $new_folder
}
Copy-Item $item.FullName -Destination $item.FullName.ToString().Replace($source,$destination).Replace($item.Name,$folder+$item.Name) 
}

#remove empty folders which where added 
$tdc="C:\test"
do {
  $dirs = gci $tdc -directory -recurse | Where { (gci $_.fullName -Force).count -eq 0 } | select -expandproperty FullName
  $dirs | Foreach-Object { Remove-Item $_ }
} while ($dirs.count -gt 0)

当前脚本

  • $_.PSIsContainer - 我认为您得到这些是为了保留文件夹结构,但最好忽略它们,因为您对它们并不直接感兴趣。 AFAICS 这就是您得到空文件夹的原因。
  • -Exclude $folder - 这什么也没做;名称为 K-G 的文件夹仍将包含在内。

  • $item.FullName.ToString() - ToString() 什么都不做,因为 $item.FullName 已经是一个字符串。 运行 $item.Fullname.GetType().Name 看看。


提议的剧本

  • Split-path 允许您使用 -Parent.

  • 获取文件所在的目录
  • .Replace($source,$destination) 与您的原始脚本相同。

  • 您无需硬编码 $folder 即可将其放入目的地。只需使用 $item.Name.SubString(0,3) 即可获取文件名的前 3 个字母。
    string manipulation demo


$bin = Get-ChildItem -Path $source -Recurse | Where-Object {($_.Name -match $filterKG)}

foreach ($item in $bin){

    $new_folder = (Split-path $item.Fullname -Parent).Replace($source,$destination) + "\" + $item.Name.SubString(0,3) + "\"

    if(-not (Test-Path $new_folder)){
        New-Item -Type dir $new_folder
        Write-Host $new_folder
    }

    Copy-Item $item.FullName -Destination $new_folder 

}