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

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

бывший. file id = c00023
sr_c00023_m145.tif = совпадение

Если есть совпадение, я хочу скопировать их в каталог COPIED_IMAGES_DIR, в противном случае добавьте его к значению переменной remaining_ids.

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

бывший. file id = c00023

  • Отфильтровать результаты, которые представляют собой файлы .md5
    com_c00023_m145.md5 = не совпадает

  • Отфильтровать результаты, в которых перед идентификатором файла есть буквы
    sc-bc00023_m145.tif = не совпадает

  • Отфильтруйте результаты, в которых есть цифры непосредственно за идентификатором файла
    smith-folder__c00023015-m145.tif = не совпадает

редактировать с дополнительными разъяснениями- Текущие потребности: (или, по крайней мере, то, что я думаю о текущих потребностях...)

  1. Прокрутите список и найдите абсолютное совпадение текущего идентификатора.
  2. Проверьте и пропустите, если это файл .md5.
  3. Проверьте и пропустите, есть ли перед текущим идентификатором, который был указан в имени файла, буква.
  4. Проверьте и пропустите, есть ли у текущего идентификатора, который был указан в имени файла, номер, следующий за ним.
  • (3 и 4 на данный момент являются самыми большими проблемными областями...) Имена файлов не имеют единообразных имен, поэтому нет последовательных разделителей, но идентификатор файла никогда не будет иметь букву непосредственно перед ним или число непосредственно за ним (если что-то из этого когда-либо имеет место - это другой идентификатор и надо отфильтровать)

Добавление условий усугубило ситуацию, и большинство файлов, которые должны совпадать, теперь пропускаются.

Вот соответствующий фрагмент кода.

set "remaining_ids = "

:: Loop for Photo Masters directory
for %%i in (%located_file_ids%) do (
    set "found=false"
    for /R "%PHOTO_MASTERS_DIR%" %%f in (*%%i*) do (
        echo %%~nxf | findstr /R /C:"\<%%i\>" >nul && (
            echo %%~nxf | findstr /R /C:"[a-zA-Z]%%i" >nul && (
                rem Skip files with a letter directly in front of the file id
            ) || (
                echo %%~nxf | findstr /R /C:"%%i[0-9]" >nul && (
                    rem Skip files with a number directly behind the file id
                ) || (
                    echo %%~nxf | findstr /I /C:"md5" >nul && (
                        rem Skip files containing "md5" anywhere in the filename
                    ) || (
                        set "found=true"
                        echo %%f located
                        copy "%%f" "%COPIED_IMAGES_DIR%"
                    )
                )
            )
        )
    )
    if !found!==false (
        echo %%i not located
        set "remaining_ids=!remaining_ids! %%i"
    )
)

Если вы поймете, в чем проблема, или у вас есть советы, как полностью переделать это, это будет очень полезно.

У вас есть пакетный файл, и вам следует обновить его до Powershell.

jdweng 06.03.2024 23:29

В вопросе @jdweng OP никогда не было кода PowerShell, и он не подразумевал, что они ищут решение PowerShell. Там был только тег, который был по праву удален другим пользователем после того, как вы решили опубликовать решение PS и добавить его снова. Я буду продолжать удалять его.

Santiago Squarzon 07.03.2024 13:23

Вопрос должен быть помечен языком сценариев, используемым для представленного кода. Это [пакетный файл]. Поскольку в заголовке, основном тексте или коде не было абсолютно никакого упоминания или использования PowerShell, он, по моему мнению, был по праву удален. Этот сайт предназначен не для удовлетворения запросов на код для одного и особенно для любого из языков из списка. По моему мнению @jdweng, ваш бесплатный ответ, закодированный на PowerShell, не соответствует критериям вопроса, и использование спам-тега в качестве основы для ответа может привлечь аргументы такого типа.

Compo 07.03.2024 13:46

@SantiagoSquarzon: В исходной публикации в качестве тега был Powershell, и ОП сказал: «Если вы поймете, в чем проблема, или у вас есть советы, как полностью переделать это, это будет очень полезно». Я переделал полностью.

jdweng 07.03.2024 13:58

Даже если ваш код был полностью прокомментирован с вспомогательным основным текстом @jdweng, называть его «подсказкой» — это несколько расширять определение!

Compo 07.03.2024 14:50

@Compo: Вы консерватор, который читает слова в вопросе ОП, а не намерения того, чего хотел ОП. Я более либерален и считаю «Лучшее решение» «Советом».

jdweng 08.03.2024 08:06

Этот сайт не предлагает бесплатную услугу написания кода. Запрос на один из них является основанием для закрытия вашего вопроса. Предоставление одного из них только поощряет появление большего количества вопросов низкого качества от участников, которые в противном случае не участвовали бы в опросе, и продвигаться вперед. Кстати, этот термин имеет политический подтекст, который меня оскорбляет.

Compo 08.03.2024 11:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
7
178
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Что-то, что вы могли бы попробовать, это для вашего цикла for...%%f.

for /R "%PHOTO_MASTERS_DIR%" %%f in (*_%%i_*) do if "%%~xf" NEQ ".md5" (
 ECHO copy "%%f" "%COPIED_IMAGES_DIR%"
)

Обратите внимание, что это, очевидно, просто покажет имена файлов в целях проверки.

ЕСЛИ указанные команды верны, удалите ключевое слово echo, чтобы действительно выполнить копирование.

[НЕ ИСПЫТАНО]

Ответ принят как подходящий

Попробуйте использовать проверенную PowerShell.

$file_Ids = @('c00023','c00024','c0025','c00026')
$directory = 'C:\Temp\PHOTO_MASTER_DIR'
foreach($id in $file_Ids)
{
   $files = Get-ChildItem -Path $directory | Where-object {($_.name -match "[^A-Za-z]$id[^\d]") -and ($_.extension -ne '.md5')}
   foreach($file in $files)
   {
       Write-Host $file $file.fullname
   }
}

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

Compo 07.03.2024 08:30

@Compo: Давайте посмотрим, что говорит ОП. Я могу легко изменить, если ОП потребует изменений.

jdweng 07.03.2024 11:47

Это не так должно работать. Если у вас есть вопросы по пониманию задачи, то это в раздел комментариев. Не следует просто публиковать код без каких-либо объяснений того, для чего он написан, особенно если он не делает того, что пытался их код, или указан в качестве его фильтров (несмотря на то, что его даже нет на языке сценариев с тегами). , поэтому ОП, скорее всего, не сможет его прочитать).

Compo 07.03.2024 13:33

@Compo: я запустил код со всеми опубликованными фильтрами OP. Если некоторые из фильтров были неточными, ОП должен добавить к публикации дополнительную информацию, чтобы получить ожидаемые результаты. По крайней мере, я опубликовал рабочее и проверенное решение. И вам не следует менять то, что написал ФП, если нет технических проблем. Вы меняете то, что не следует менять.

jdweng 07.03.2024 14:01

Нет, вы использовали _`$id`_ и исключили расширение .md5. В фильтрах не было ни одного символа алфавита, непосредственно предшествующего идентификатору, и никакой цифры, следующей за ним. ОП было бы проще указать «идентификаторы, изолированные между подчеркиваниями», чем создавать набор фильтров, если это все, что они хотели!. Кроме того, вы предположили, что все базовые имена файлов должны начинаться с подстроки sr_, поскольку это не указано ни в их текстовом теле, ни в отправленном коде. Подчеркивание тоже не было явным, но было гораздо более справедливым предположением. Матчи: sr_1c00023_*, sr_c00023b_*, *_*1c00023b*_*.

Compo 07.03.2024 14:40

Кстати, поскольку вы решили упомянуть что-то, что я изменил, чего мне не следовало делать, я был бы признателен, если бы вы выделили это/те специально для меня, и я соответственно исправлю или изложу здесь свои контраргументы. Идея состоит в том, чтобы сделать вопрос понятным для международной аудитории и сделать его максимально кратким, не переусердствуя и не изменяя параметры программного вопроса. Это касается не только технических вопросов!

Compo 07.03.2024 14:58

@Compo: Нам действительно не следует спорить. Публикация ОП требует некоторых пояснений. У меня хорошее начало, и я ожидал, что потребуются некоторые изменения. ОП может знать Regex и сам вносить изменения. Я бы использовал "^sr`_\d*$id[A-Za-z]*`_"

jdweng 07.03.2024 18:42

Я не спорю! ОП уже предоставил некоторую дополнительную информацию (3 часа назад). Ситуация с фильтрацией до сих пор неясна, но мой первоначальный анализ был намного точнее, чем ваши предположения. В ФП упомянуто, что «буква» и «цифра» не находятся непосредственно «до» и «после» идентификатора. Это по-прежнему оставляет следующее совпадение *_*b1c00023b1*_*. Буква стоит косвенно перед идентификатором (не напрямую), а число косвенно следует за идентификатором (не напрямую). И помните, что подчеркивание также не было явно определено как часть имени!

Compo 07.03.2024 19:03

Спасибо за всю помощь и прошу прощения, если мое незнание правил публикации вызвало какой-либо конфликт. Я возился и собрал регулярное выражение, которое, кажется, работает хорошо, когда я тестирую идентификатор (?!.*\.md5)(?<![a-zA-Z])(?!\d)currentID(?! \d) Вот ссылка, если кто-то хочет увидеть это в действии - regex101.com/r/huqeF3/1

dmaltron87 07.03.2024 20:08

Я обновил код новым Regex. Я думаю, что у меня проще, чем у тебя.

jdweng 07.03.2024 21:40

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

Compo 08.03.2024 00:37

@Compo: В оригинальной публикации OP в качестве тега указан Powershell и написано: «Если вы видите, в чем проблема, или у вас есть советы, как полностью это переделать». Я считаю свое решение «переделать это полностью». Люди продолжают редактировать сообщения ОП и удалять тег Powershell.

jdweng 08.03.2024 02:29

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

Compo 08.03.2024 11:28

@Compo: Посмотрите теги в исходной публикации. Там было написано Powershell. Почему люди вырезали пожелания ОП?

jdweng 08.03.2024 13:00

Вы прочитали мои предыдущие комментарии и поняли, как работает этот сайт? Код PowerShell не был отправлен, а PowerShell не упоминался ни в заголовке, ни в основном тексте. Тегу там не было места, и он был правильно удален. Не имеет значения, был ли ОП доволен каким-либо другим способом достижения задачи, если бы они включали, например. Теги vbscript, c++, python без сопутствующего кода, использующего их, они также будут удалены. Мы помогаем программистам исправлять их код, а не пишем для них совершенно новый код на другом языке только потому, что можем. Ваш ответ не поможет пакетным скриптерам.

Compo 08.03.2024 13:45

@Compo: у меня есть комментарии от других пользователей Stackoverflow о том, что альтернативные решения допустимы.

jdweng 08.03.2024 14:55

Кажется, вы говорите мне, что у людей разные мнения. Спустя более чем полвека на этой планете это не застало меня врасплох. Я понятия не имею, почему вы преследуете меня из-за иного мнения; не я удалил тег или заявил, что они будут продолжать это делать, а просто другой человек, у которого было отличное от вас мнение. Знаете ли вы, что произойдет, если один конкретный язык будет рассылать спам-решения по каждому вопросу SO, не отправив код на этом языке? Это не и никогда не был сайт, где язык противопоставляется языку.

Compo 08.03.2024 16:18

@jdweng Обновление до Powershell было гораздо лучшим решением, чем мой исходный код. Спасибо за рекомендацию. Кажется, теперь с этим разобрались.

dmaltron87 08.03.2024 17:01

@Compo: Моя жалоба на то, что кто-то удалил тег PS, и тогда показалось, что мое решение не соответствовало желанию ОП. Если бы TAG все еще был там, вы, вероятно, не начали бы этот разговор.

jdweng 08.03.2024 19:57

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

Compo 08.03.2024 21:29

@Compo: Имеет ли смысл в моем ответе стоять галочка с -1 баллом? Извините за разногласия, но в последнее время у меня было много проблем с людьми, которым не нравилось, что я отвечаю с разными подходами. Некоторые модераторы говорят, что альтернативные решения приемлемы, а другие нет.

jdweng 08.03.2024 22:20

Да; Если ОП хотел, чтобы был предоставлен запрос кода не по теме, и вы согласились, это не означает, что ваш код отвечает на опубликованную проблему с программным кодом, и их галочка не меняет этого. Что касается отрицательного голоса, я не знаю, когда вы его получили (возможно, когда ваш код не соответствовал запрошенным фильтрам), но у меня не было бы проблем с тем, чтобы кто-то проголосовал против кода без поддержки текста или комментариев и того, что написано на совершенно другом языке, чем в представлении. Нет никакой корреляции между «полезностью для других пользователей», то есть голосованием, и «принятием ОП», то есть галочкой.

Compo 08.03.2024 23:08

Другие вопросы по теме