1

У меня есть 100 файлов в одном каталоге. Это новые файлы, которые должны заменить старые файлы, расположенные во многих подкаталогах. Я думаю, что это должно быть сделано: искать по одному файлу за раз, а затем заменить его. До сих пор я нашел способ найти файлы в каталогах, но не могу использовать каждое имя файла, чтобы заменить его новым.

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

Я думал, что это будет простая задача, но я немного борюсь. Что я могу сделать, чтобы использовать список и заменить каждый файл? Как я могу использовать команду Where-object, чтобы использовать каждое имя файла и заменить новый файл старым?

1 ответ1

0

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].

В зависимости от конкретного сценария, к которому вы применяете это, вы можете добавить проверки для обработки файла, найденного в нескольких подкаталогах.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .