我想创建一个脚本,该脚本将占用一个父目录,该目录中包含许多包含文件的子目录。使用列表我希望将子目录中的所有文件移动到父目录中。
到目前为止,我创建了以下代码,它列出了子目录中指定类型的所有文件,但我不确定如何大规模移动所有子文件。
Write-host "Please enter source Dir:"
$sourceDir = read-host
Write-Host "Format to look for with . :"
$format = read-host
#Write-host "Please enter output Dir:"
#$outDir = read-host
$Dir = get-childitem -Path $sourceDir -Filter $format -recurse | format-table name
$files = $Dir | where {$_.extension -eq "$format"}
$files #| format-table name
答案 0 :(得分:8)
一些事情:
您可以将您写入屏幕的文本直接传递给读取主机cmdlet,它可以为每个用户输入节省一行。
根据经验,如果您打算使用命令输出执行更多操作,请不要将其传递给format- * cmdlet。 cmdlet格式生成格式化对象,指示powershell如何在屏幕上显示结果。
尽量避免将结果分配给变量,如果结果包含大量文件系统,则内存消耗可能会非常高,并且可能会降低性能。
同样,在性能方面,尝试使用cmdlet参数而不是where-object cmdlet(服务器端过滤与客户端)。第一个过滤目标上的对象,而后者仅在到达您的机器后过滤对象。
WhatIf开关将显示哪些文件已移动。删除它以执行命令。您可能还需要对其进行处理以处理重复的文件名。
$sourceDir = read-host "Please enter source Dir"
$format = read-host "Format to look for"
Get-ChildItem -Path $sourceDir -Filter $format -Recurse | Move-Item -Destination $sourceDir -Whatif
答案 1 :(得分:1)
如果我正确理解了您的问题,您可以在文件上使用Move-Item
将它们移动到输出目录:
$Dir = get-childitem $sourceDir -recurse
$files = $Dir | where {$_.extension -eq "$format"}
$files | move-item -destination $outDir
答案 2 :(得分:0)
之前的一张海报指出该脚本会覆盖同名文件。可以通过测试扩展脚本并避免这种可能性。像这样:
$sourceDir = read-host "Please enter source Dir"
$format = read-host "Format to look for?"
$destDir = read-host "Please enter Destination Dir"
Get-ChildItem -Path $sourceDir -Filter $format -Recurse | Copy-Item -Destination $DestDir
$files = $DestDir | where {$_.extension -eq "$format"}
If (Test-Path $files) {
$i = 0
While (Test-Path $DestinationFile) {
$i += 1
$DestinationFile = "$files$i.$format"
Copy-Item -Destination $DestDir $DestinationFile
}
}
Else {
$DestinationFile = "$files$i.$format"
Copy-Item -Destination $DestDir $DestinationFile
}
Copy-Item -Path $SourceFile -Destination $DestinationFile -Force