#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 упоминается, что это необходимо, мы можем включить дополнительную логику или альтернативный подход.