я в основном хочу бежать:
C:\>xcopy [0-9]{13}\.(gif|jpg|png) s:\TargetFolder /s
я знаю xcopy
, не поддерживает регулярные выражения поиска файлов.
я не могу узнать , как узнать, если PowerShell имеет Cmdlet
для копирования файлов; и если это так, как выяснить, поддерживает ли оно сопоставление имени файла с регулярным выражением.
Может кто-нибудь придумать, как выполнить рекурсивное копирование / перемещение файла с помощью сопоставления имен регулярных выражений?
windows
file-management
regex
xcopy
Ян Бойд
источник
источник
Ответы:
Мне нравится использовать все команды Powershell, когда я могу. После небольшого тестирования это лучшее, что я могу сделать.
Первые три строки просто для облегчения чтения, вы можете определить переменные внутри фактических команд, если хотите. Ключ к этому примеру кода - команда «Где-объект», которая является фильтром, который принимает сопоставление с регулярным выражением. Следует отметить, что поддержка регулярных выражений немного странная. Я нашел ссылку PDF карту здесь , которая имеет поддерживаемые символы на левой стороне.
[РЕДАКТИРОВАТЬ]
Как уже упоминалось "@Johannes Rössel", вы также можете уменьшить последние две строки до одной строки.
Основное отличие состоит в том, что метод Йоханнеса выполняет фильтрацию объектов, а мой - фильтрацию текста. При работе с Powershell почти всегда лучше использовать объекты.
[EDIT2]
Как упоминалось в @smoknheap, приведенные выше сценарии сгладят структуру папок и поместят все ваши файлы в одну папку. Я не уверен, есть ли переключатель, который сохраняет структуру папок. Я попробовал переключатель -Recurse, и это не помогает. Единственный способ заставить это работать - вернуться к манипуляции со строками и добавить папки в мой фильтр.
Я уверен, что есть более элегантный способ сделать это, но из моих тестов это работает. Он собирает все и затем фильтрует как совпадения имен, так и объекты папок. Мне пришлось использовать метод ToString (), чтобы получить доступ к манипуляции со строками.
[EDIT3]
Теперь, если вы хотите сообщить путь, убедитесь, что у вас все правильно. Вы можете использовать команду «Write-Host». Вот код, который даст вам несколько советов о том, что происходит.
Это должно вернуть соответствующие строки. Если вы где-нибудь ничего не получите, вы будете знать, с какими предметами возникают проблемы.
Надеюсь это поможет
источник
$item.FullName
его - соответствующее свойство берется автоматически, если вы передаете объект FileInfo (имхо, вы не должны этого делать , поскольку мощь PowerShell заключается в передаче структурированных объектов, а не строк). Кроме того, вы можете поместить все в один конвейер:((gci $source) -match $filter) | cp -dest $destination
(слегка адаптированный для краткости - не стесняйтесь менять; я просто говорю, что вforeach
этом нет необходимости).Copy-Item : Cannot bind argument to parameter 'Path' because it is null
Trim
он не предназначен для удаления строки из конца другой строки, вместо этого он удаляет все вхождения символов в строке параметра из начала и конца строки, для которой она вызывается. В вашем случае, если он$item.Name
содержит заглавную букву C, он также удалит букву диска C из начала строки.PowerShell - отличный инструмент для решения этой задачи. Вы можете использовать командлет Copy-Item для процесса копирования. Вы можете передать его с помощью других командлетов для сложных команд копирования, вот кто-то, кто сделал именно это :)
Регулярные выражения используют класс .NET RegEx из пространства имен System.Text.RegularExpressions, в этом классе есть быстрые инструкции
В PowerShell также есть операторы -match и -replace, которые можно использовать при конвейерной передаче с copy-item
Есть также инструменты, которые помогут вам создать сам RegEx, например, приятель RegEx
источник
-match
и-replace
следует упомянуть, прежде чем идти вSystem.Text.RegularExpressions.RegEx
. По крайней мере, я редко пользуюсь[regex]
напрямую; Однако я действительно часто использую-match
и-replace
оператор. Что касается создания регулярных выражений, я обнаружил, что PowerShell весьма полезен для тестирования и уточнения регулярного выражения, которое вы пишете.как идея, но нуждается в некоторой работе
dir -r | ? {$ _ -match '[0-9] {13} \. (gif | jpg | png)'} | % {xcopy $ _. полное имя c: \ temp}
источник