从一个目录复制 100 个新文件,并用当前位置的旧文件替换每个文件

从一个目录复制 100 个新文件,并用当前位置的旧文件替换每个文件

我在一个目录中有 100 个文件。这些是需要替换位于许多子目录中的旧文件的新文件。我认为应该做的是:一次搜索一个文件,然后替换它。到目前为止,我已经想出了一种在目录中查找文件的方法,但似乎无法使用每个文件名将其替换为新文件。

$files = @(Get-ChildItem D:\topLevelDir\*.txt)
foreach ($file in $files) { gci -Path C:\Users\MyUserName\ -filter $file.Name -Recurse -ErrorAction SilentlyContinue -Force}

我以为这是一项简单的任务,但我有点挣扎。我该怎么做才能使用列表并替换每个文件?我如何使用哪里对象命令使用每个文件名并用旧文件替换新文件?

答案1

Where-Object非常适合接收对象列表并根据某些条件对其进行梳理。用于$_与您每次输入的每个对象进行交互。

$newFiles = "C:\Users\username\new"
$oldFiles = "C:\Users\username\originals"

Get-ChildItem $newFiles | ForEach-Object {

    $currentFile = $_

    $oldFileLocation = Get-ChildItem -Recurse $oldFiles | Where-Object { $_ -Match "$currentFile"} | Select-Object -ExpandProperty DirectoryName

    if($oldFileLocation) {   # if this variable is not null, we've found original file location
        Write-Host "found file [$currentFile] in location: [$oldFileLocation]. overwriting the original."
        Copy-Item -Path $newFiles\$currentFile -Destination $oldFileLocation -Force
    }
    else {
        Write-Warning "could not find file [$currentFile] in location [$oldFiles]."
    }

}

如果与以下测试文件一起使用:

C:\Users\username\new\
-file1.txt
-file2.txt
-file3.txt
-file4.txt

C:\Users\username\originals\
-foldera\file2.txt
-folderb\foo\file3.txt
-folderc\file1.txt

结果是:

found file [file1.txt] in location: [C:\Users\username\originals\folderc]. overwriting the original.
found file [file2.txt] in location: [C:\Users\username\originals\foldera]. overwriting the original.
found file [file3.txt] in location: [C:\Users\username\originals\folderb\foo]. overwriting the original.
WARNING: could not find file [file4.txt] in location [C:\Users\username\originals].

根据您应用此功能的特定场景,您可能需要添加检查来处理在多个子目录中找到的文件。

相关内容