В настоящее время у меня есть список идентификаторов файлов как значений переменной с именем 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 = не совпадает
редактировать с дополнительными разъяснениями- Текущие потребности: (или, по крайней мере, то, что я думаю о текущих потребностях...)
Добавление условий усугубило ситуацию, и большинство файлов, которые должны совпадать, теперь пропускаются.
Вот соответствующий фрагмент кода.
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"
)
)
Если вы поймете, в чем проблема, или у вас есть советы, как полностью переделать это, это будет очень полезно.
В вопросе @jdweng OP никогда не было кода PowerShell, и он не подразумевал, что они ищут решение PowerShell. Там был только тег, который был по праву удален другим пользователем после того, как вы решили опубликовать решение PS и добавить его снова. Я буду продолжать удалять его.
Вопрос должен быть помечен языком сценариев, используемым для представленного кода. Это [пакетный файл]. Поскольку в заголовке, основном тексте или коде не было абсолютно никакого упоминания или использования PowerShell, он, по моему мнению, был по праву удален. Этот сайт предназначен не для удовлетворения запросов на код для одного и особенно для любого из языков из списка. По моему мнению @jdweng, ваш бесплатный ответ, закодированный на PowerShell, не соответствует критериям вопроса, и использование спам-тега в качестве основы для ответа может привлечь аргументы такого типа.
@SantiagoSquarzon: В исходной публикации в качестве тега был Powershell, и ОП сказал: «Если вы поймете, в чем проблема, или у вас есть советы, как полностью переделать это, это будет очень полезно». Я переделал полностью.
Даже если ваш код был полностью прокомментирован с вспомогательным основным текстом @jdweng, называть его «подсказкой» — это несколько расширять определение!
@Compo: Вы консерватор, который читает слова в вопросе ОП, а не намерения того, чего хотел ОП. Я более либерален и считаю «Лучшее решение» «Советом».
Этот сайт не предлагает бесплатную услугу написания кода. Запрос на один из них является основанием для закрытия вашего вопроса. Предоставление одного из них только поощряет появление большего количества вопросов низкого качества от участников, которые в противном случае не участвовали бы в опросе, и продвигаться вперед. Кстати, этот термин имеет политический подтекст, который меня оскорбляет.





Без разъяснения необходимых условий, примеров имен файлов, которые должны были быть скопированы, но были исключены, не должны были быть скопированы, а были скопированы и любых других нежелательных действий, вы действительно спрашиваете, какой длины является кусок строки, однако -
Что-то, что вы могли бы попробовать, это для вашего цикла 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: Давайте посмотрим, что говорит ОП. Я могу легко изменить, если ОП потребует изменений.
Это не так должно работать. Если у вас есть вопросы по пониманию задачи, то это в раздел комментариев. Не следует просто публиковать код без каких-либо объяснений того, для чего он написан, особенно если он не делает того, что пытался их код, или указан в качестве его фильтров (несмотря на то, что его даже нет на языке сценариев с тегами). , поэтому ОП, скорее всего, не сможет его прочитать).
@Compo: я запустил код со всеми опубликованными фильтрами OP. Если некоторые из фильтров были неточными, ОП должен добавить к публикации дополнительную информацию, чтобы получить ожидаемые результаты. По крайней мере, я опубликовал рабочее и проверенное решение. И вам не следует менять то, что написал ФП, если нет технических проблем. Вы меняете то, что не следует менять.
Нет, вы использовали _`$id`_ и исключили расширение .md5. В фильтрах не было ни одного символа алфавита, непосредственно предшествующего идентификатору, и никакой цифры, следующей за ним. ОП было бы проще указать «идентификаторы, изолированные между подчеркиваниями», чем создавать набор фильтров, если это все, что они хотели!. Кроме того, вы предположили, что все базовые имена файлов должны начинаться с подстроки sr_, поскольку это не указано ни в их текстовом теле, ни в отправленном коде. Подчеркивание тоже не было явным, но было гораздо более справедливым предположением. Матчи: sr_1c00023_*, sr_c00023b_*, *_*1c00023b*_*.
Кстати, поскольку вы решили упомянуть что-то, что я изменил, чего мне не следовало делать, я был бы признателен, если бы вы выделили это/те специально для меня, и я соответственно исправлю или изложу здесь свои контраргументы. Идея состоит в том, чтобы сделать вопрос понятным для международной аудитории и сделать его максимально кратким, не переусердствуя и не изменяя параметры программного вопроса. Это касается не только технических вопросов!
@Compo: Нам действительно не следует спорить. Публикация ОП требует некоторых пояснений. У меня хорошее начало, и я ожидал, что потребуются некоторые изменения. ОП может знать Regex и сам вносить изменения. Я бы использовал "^sr`_\d*$id[A-Za-z]*`_"
Я не спорю! ОП уже предоставил некоторую дополнительную информацию (3 часа назад). Ситуация с фильтрацией до сих пор неясна, но мой первоначальный анализ был намного точнее, чем ваши предположения. В ФП упомянуто, что «буква» и «цифра» не находятся непосредственно «до» и «после» идентификатора. Это по-прежнему оставляет следующее совпадение *_*b1c00023b1*_*. Буква стоит косвенно перед идентификатором (не напрямую), а число косвенно следует за идентификатором (не напрямую). И помните, что подчеркивание также не было явно определено как часть имени!
Спасибо за всю помощь и прошу прощения, если мое незнание правил публикации вызвало какой-либо конфликт. Я возился и собрал регулярное выражение, которое, кажется, работает хорошо, когда я тестирую идентификатор (?!.*\.md5)(?<![a-zA-Z])(?!\d)currentID(?! \d) Вот ссылка, если кто-то хочет увидеть это в действии - regex101.com/r/huqeF3/1
Я обновил код новым Regex. Я думаю, что у меня проще, чем у тебя.
Я предпочитаю обновленное регулярное выражение в ответе выше, а также отдельное исключение расширений (хотя может быть незначительное снижение эффективности), в зависимости от того, что, по-видимому, указывают фильтры. Хотя технически ни то, ни другое не является исправлением кода вопроса, поэтому не может рассматриваться как решение.
@Compo: В оригинальной публикации OP в качестве тега указан Powershell и написано: «Если вы видите, в чем проблема, или у вас есть советы, как полностью это переделать». Я считаю свое решение «переделать это полностью». Люди продолжают редактировать сообщения ОП и удалять тег Powershell.
Полностью «переписывание» кода на языке, не используемом в вопросе, и его отправка без комментариев или вспомогательной информации не имеет смысла для будущих читателей, ищущих помощь для своего кода на другом языке.
@Compo: Посмотрите теги в исходной публикации. Там было написано Powershell. Почему люди вырезали пожелания ОП?
Вы прочитали мои предыдущие комментарии и поняли, как работает этот сайт? Код PowerShell не был отправлен, а PowerShell не упоминался ни в заголовке, ни в основном тексте. Тегу там не было места, и он был правильно удален. Не имеет значения, был ли ОП доволен каким-либо другим способом достижения задачи, если бы они включали, например. Теги vbscript, c++, python без сопутствующего кода, использующего их, они также будут удалены. Мы помогаем программистам исправлять их код, а не пишем для них совершенно новый код на другом языке только потому, что можем. Ваш ответ не поможет пакетным скриптерам.
@Compo: у меня есть комментарии от других пользователей Stackoverflow о том, что альтернативные решения допустимы.
Кажется, вы говорите мне, что у людей разные мнения. Спустя более чем полвека на этой планете это не застало меня врасплох. Я понятия не имею, почему вы преследуете меня из-за иного мнения; не я удалил тег или заявил, что они будут продолжать это делать, а просто другой человек, у которого было отличное от вас мнение. Знаете ли вы, что произойдет, если один конкретный язык будет рассылать спам-решения по каждому вопросу SO, не отправив код на этом языке? Это не и никогда не был сайт, где язык противопоставляется языку.
@jdweng Обновление до Powershell было гораздо лучшим решением, чем мой исходный код. Спасибо за рекомендацию. Кажется, теперь с этим разобрались.
@Compo: Моя жалоба на то, что кто-то удалил тег PS, и тогда показалось, что мое решение не соответствовало желанию ОП. Если бы TAG все еще был там, вы, вероятно, не начали бы этот разговор.
Так что поговорите с ними, имя их учетной записи легко просмотреть, и они уже сказали вам, что сделали это. Вы также можете перенаправить свой гнев на того, кто проголосовал против вас и/или проголосовал за удаление вашего ответа; не я, который дал вам ценный совет по критериям фильтрации и высказал предпочтение вашему регулярному выражению. Если вы продолжите меня преследовать, я сам проголосую против вас, проголосую за удаление вашего ответа и сообщу о вас модераторам.
@Compo: Имеет ли смысл в моем ответе стоять галочка с -1 баллом? Извините за разногласия, но в последнее время у меня было много проблем с людьми, которым не нравилось, что я отвечаю с разными подходами. Некоторые модераторы говорят, что альтернативные решения приемлемы, а другие нет.
Да; Если ОП хотел, чтобы был предоставлен запрос кода не по теме, и вы согласились, это не означает, что ваш код отвечает на опубликованную проблему с программным кодом, и их галочка не меняет этого. Что касается отрицательного голоса, я не знаю, когда вы его получили (возможно, когда ваш код не соответствовал запрошенным фильтрам), но у меня не было бы проблем с тем, чтобы кто-то проголосовал против кода без поддержки текста или комментариев и того, что написано на совершенно другом языке, чем в представлении. Нет никакой корреляции между «полезностью для других пользователей», то есть голосованием, и «принятием ОП», то есть галочкой.
У вас есть пакетный файл, и вам следует обновить его до Powershell.