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
}
我想将一堆 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
}