Пакет: у меня есть строка в переменной %filename%. Мне нужно проверить его на наличие известной переменной %year% и использовать ее, чтобы упростить строку до заголовка.
Пример:
The Grand Strategy (1999) whatever.pdf
...станет...
The Grand Strategy
...так что смысл будет заключаться в том, чтобы использовать год в качестве точки отсечения, удаляя вместе с ним год и остальную часть имени файла. Сценарий должен работать для любого неизвестного имени файла.
мой код:
for /f "delims = " %%r in ('powershell -command "if ('!title!' -match '\b(19|20)\d{2}\b') { echo $matches[0] } else { echo No match }"') do set "year=%%r"
set title=!title: (%year%)=& rem !"
Вам не хватает двойной кавычки, и мы должны предположить, что у вас включено отложенное расширение. Ваш код всегда должен представлять собой минимально воспроизводимый пример.
Нам определенно нужно больше информации обо всех возможных строковых шаблонах, прежде чем мы сможем предложить надежную методологию. Кроме того, у вас есть технически отправленный код без указания того, в чем проблема с этим кодом. Наша работа — помочь вам решить проблему с вашим кодом, а не дать вам код для решения конкретной задачи. Мы не являемся бесплатным сайтом для написания кода.
Предполагая, что у вас включено отложенное расширение и определена переменная title
, как только вы поместите двойную кавычку в команду set title
, ваш код будет работать нормально.
Согласен с комментарием выше. Но этот код был разработан для удаления всего, включая шаблон: пробел, открывающую скобку, 19
или 20
, две цифры и закрывающую скобку. Кажется, вы запрашиваете код, который сделает это для других потенциальных шаблонов. Это само по себе не вопрос по теме, а просто надежда, что кто-нибудь предоставит вам волшебный шаблон регулярного выражения для каждого возможного имени файла, который у вас может быть.
В вашем коде возникнут проблемы, если в заголовке до или после года будет стоять амперсанд. Достаточно легко решить проблему, если амперсанд стоит перед годом, но если он после года, вы получите синтаксическую ошибку. Я думаю, что лучшим решением было бы найти, в какой позиции находится год в строке. Затем подстроку заголовка и удаление всех конечных пробелов.
да, задержка расширения. шаблоны строк не имеют значения, они только усложнят вопрос. Я исправил недостающую цитату только для того, чтобы увидеть, что она не удалась. видите, я пытаюсь заменить год на & rem
, чтобы удалить остальную часть имени файла, в результате чего echo %title% будет !title:1999=
. Я понимаю, что это странный, немного хакерский способ сделать это, но это единственная идея, которая у меня есть.
@Compo, хорошо, я опубликую все это, но учтите, все, что мне нужно, это способ обрезать имя файла
@Bricktop, как я уже говорил, вам нужно предоставить только минимально воспроизводимый пример. Первоначально опубликованный вами код был не таким, а опубликованный вами новый код не является минимальным. Вы понимаете, что я пытаюсь донести? Как бы то ни было, как я уже говорил, я использовал ваш код для Use PowerShell to find and remove year
, и он отлично работал на моем компьютере.
@Bricktop, я не просил весь твой код, не так ли? Я попросил привести примеры всех возможных шаблонов именования файлов, которые вы хотели бы охватить в коде. Но я также сказал, что мы здесь не для того, чтобы модифицировать код, представленный для одного шаблона именования, чтобы он охватывал все остальные. Это будет запрос кода, а не помощь в устранении конкретной проблемы с кодом.
Проще и надежнее позволить PowerShell извлечь префикс за вас, используя его оператор -replace:
@echo off
:: Sample title
set "title=The Grand Strategy (1999) whatever.pdf"
for /f "usebackq delims = " %%r in (`
powershell -NoProfile -Command "$env:title -replace ' *\((19|20)\d{2}\).*'"
`) do set "title=%%r"
:: Diagnostic output to verify the result.
:: -> "The Grand Strategy"
echo "%title%"
Примечание:
Вышеупомянутое не требует setlocal enabledelayedexpansion
.
Заставляя команду PowerShell ссылаться на переменную title
как на переменную среды $env:title
, можно избежать проблем, которые могли бы возникнуть, если бы значение переменной title
было непосредственно встроено в команду.
Идеальный! Я знал, что должен быть способ обрезать струну. Я получил так много плохих отзывов, пытаясь «попросить код», поэтому мне приходится спрашивать; Где можно спрашивать, какую команду использовать для чего-либо?
Рад слышать, что это помогло, @Bricktop. Я думаю, что ваш вопрос в порядке: цель четко определена, и вы включили попытку решения; единственное, чего не хватает, — это описания того, почему ваш собственный код потерпел неудачу. Лучшие подходы часто автоматически предлагаются в ответах, как в этом случае. Я ответил до того, как вы опубликовали полный код, и вижу, что у вас есть дополнительное требование — фиксировать соответствие регулярных выражений в переменных пакетного файла. Если вам нужна помощь в этом, я предлагаю задать новый вопрос. В любом случае я предлагаю удалить полный код из вопроса, чтобы не отвлекать внимание.
Сделаем шаг назад, @Bricktop: каждый вызов PowerShell CLI является дорогостоящим, поэтому в идеале все задачи должны выполняться за один вызов, хотя это может сделать вызов CLI громоздким. Рассмотрите возможность перехода на решение, полностью поддерживающее PowerShell, с помощью сценария PowerShell (.ps1
).
Судя по вашему примеру, похоже, что вы используете пробел и скобку перед годом. Можете ли вы уточнить? Можете ли вы показать, что вы уже пробовали?