Как выполнить поиск каталога и подкаталогов на основе текстового файла с частичными именами файлов и скопировать эти файлы в новый каталог

#powershell #command-prompt

#powershell #командная строка

Вопрос:

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

 @echo off
for /f "tokens=1,* delims=," %%j in (filelist.txt) do (
 for /r "E:Source"  %%a in ("%%j") do (
    copy "%%a" "C:Destination%%k"
 )
)
  

Это работает, если я хочу выполнить поиск только в папке «Source», но я не могу выполнить поиск в каких-либо папках внутри папки «Source». Надеюсь, кто-нибудь сможет сказать мне, чего мне не хватает.

Я новичок в этом, поэтому, пожалуйста, скажите мне, нужна ли вам дополнительная информация.

Комментарии:

1. какова структура файла с именами целевых файлов?

2. Ваш тег — powershell, но вы представляете пакетный файл. Итак, что вам нужно?

Ответ №1:

Это должно помочь вам начать, если вы решите использовать Powershell.

 $files = 'C:list.txt'
$location = 'C:files'
$destination = 'C:destination'

# for each filename in "list.txt", look for the file in C:destination, recursively
gc $files | % {
    write-host "looking for $_"

    $result = gci -Recurse $location $_

    if($result) {
        write-host -ForegroundColor Green "found $_ in $location!"
        write-host "copying $_ to $destination..."
        copy-item $result.FullName $destination$_
    }
}
  

Результат будет выглядеть следующим образом:

введите описание изображения здесь

-Recurse Флаг помогает вам с проблемами при обходе подкаталогов.

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

Комментарии:

1. Пожалуйста, используйте Join-Path -Path $destination -ChildPath ($_.Name) . Теперь вы постоянно обрабатываете объект FileInfo $_ просто как строку, не содержащую ничего, кроме имени файла..

2. Как в copy-item $result.FullName (join-path $destination $_.Name) ? Это могло бы сработать, но почему это предпочтительнее?

3. Ваш подход (и OPs) предполагает только одно вхождение текущего файла в $location и в противном случае перезапишет файл в пункте назначения?

4. Хороший момент. Это все еще подходящая отправная точка, учитывая, что мы не знаем (и редко когда узнаем) всех условий, которые потребуется учитывать операционной системе. Если в OP упоминается, что это необходимо, мы можем включить дополнительную логику или альтернативный подход.