我试图创建一个脚本,它将找到所有与字符串匹配的文件,并在重新创建文件夹结构时移动它们,如果已经存在同名文件,则重命名它们。问题是,我得到了可怕的“无法找到路径的一部分”错误。我已经找到了各种解决方案,但我想有更好的/“正确”的方法,我想看看我错在哪里。下面是我的:
$sourceDir = "E:\Folder1"
$targetDir = "E:\Deep Storage\Folder1"
$search = "*readme.txt*"
Get-ChildItem -Path $sourceDir -Filter $search -Recurse | ForEach-Object {
$relativePath = $_.FullName.Substring($sourceDir.Length)
$nextName = Join-Path -Path $targetDir -ChildPath $relativePath
$num = 1
while(Test-Path -Path $nextName)
{
$nextName = Join-Path $targetDir ($relativePath + "_$num" + $_.Extension)
$num += 1
}
$_ | Move-Item -Destination $nextName -Force -Verbose
}
我的解决方法是首先运行以下命令:
robocopy $sourceDir $targetDir /e /xf *.*
我知道如果目标文件夹不存在,Move-Item会有问题,但我不知道如何告诉Powershell在必要时创建目标目录。我的解决方法是使用Robocopy从源目录重新创建目录结构,以使Move-Item满意。问题是,Robocopy路径需要很长时间。
我有另一个专门创建文件夹的脚本,所以这可能是答案,但我不确定如何将其与我已有的代码混合:
If(!(test-path $targetDir))
{
New-Item -ItemType Directory -Force -Path $targetDir
}
有没有更好的办法?
1条答案
按热度按时间oknrviil1#
未经测试,但这应该让你接近。我省略了编号,因为只有当来自多个位置的项目被移动/复制到一个位置,并且有可能出现“...已经存在...”错误时,才需要编号。