Удаление оставшейся части строки с места известного слова

Пакет: у меня есть строка в переменной %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 !"

Судя по вашему примеру, похоже, что вы используете пробел и скобку перед годом. Можете ли вы уточнить? Можете ли вы показать, что вы уже пробовали?

SiKing 07.08.2024 20:53

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

Squashman 07.08.2024 21:29

Нам определенно нужно больше информации обо всех возможных строковых шаблонах, прежде чем мы сможем предложить надежную методологию. Кроме того, у вас есть технически отправленный код без указания того, в чем проблема с этим кодом. Наша работа — помочь вам решить проблему с вашим кодом, а не дать вам код для решения конкретной задачи. Мы не являемся бесплатным сайтом для написания кода.

Compo 07.08.2024 21:33

Предполагая, что у вас включено отложенное расширение и определена переменная title, как только вы поместите двойную кавычку в команду set title, ваш код будет работать нормально.

Squashman 07.08.2024 21:40

Согласен с комментарием выше. Но этот код был разработан для удаления всего, включая шаблон: пробел, открывающую скобку, 19 или 20, две цифры и закрывающую скобку. Кажется, вы запрашиваете код, который сделает это для других потенциальных шаблонов. Это само по себе не вопрос по теме, а просто надежда, что кто-нибудь предоставит вам волшебный шаблон регулярного выражения для каждого возможного имени файла, который у вас может быть.

Compo 07.08.2024 22:07

В вашем коде возникнут проблемы, если в заголовке до или после года будет стоять амперсанд. Достаточно легко решить проблему, если амперсанд стоит перед годом, но если он после года, вы получите синтаксическую ошибку. Я думаю, что лучшим решением было бы найти, в какой позиции находится год в строке. Затем подстроку заголовка и удаление всех конечных пробелов.

Squashman 07.08.2024 22:07

да, задержка расширения. шаблоны строк не имеют значения, они только усложнят вопрос. Я исправил недостающую цитату только для того, чтобы увидеть, что она не удалась. видите, я пытаюсь заменить год на & rem, чтобы удалить остальную часть имени файла, в результате чего echo %title% будет !title:1999=. Я понимаю, что это странный, немного хакерский способ сделать это, но это единственная идея, которая у меня есть.

Bricktop 07.08.2024 22:18

@Compo, хорошо, я опубликую все это, но учтите, все, что мне нужно, это способ обрезать имя файла

Bricktop 07.08.2024 22:21

@Bricktop, как я уже говорил, вам нужно предоставить только минимально воспроизводимый пример. Первоначально опубликованный вами код был не таким, а опубликованный вами новый код не является минимальным. Вы понимаете, что я пытаюсь донести? Как бы то ни было, как я уже говорил, я использовал ваш код для Use PowerShell to find and remove year, и он отлично работал на моем компьютере.

Squashman 07.08.2024 22:50

@Bricktop, я не просил весь твой код, не так ли? Я попросил привести примеры всех возможных шаблонов именования файлов, которые вы хотели бы охватить в коде. Но я также сказал, что мы здесь не для того, чтобы модифицировать код, представленный для одного шаблона именования, чтобы он охватывал все остальные. Это будет запрос кода, а не помощь в устранении конкретной проблемы с кодом.

Compo 07.08.2024 23:20
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
10
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Проще и надежнее позволить 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 07.08.2024 22:41

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

mklement0 07.08.2024 23:01

Сделаем шаг назад, @Bricktop: каждый вызов PowerShell CLI является дорогостоящим, поэтому в идеале все задачи должны выполняться за один вызов, хотя это может сделать вызов CLI громоздким. Рассмотрите возможность перехода на решение, полностью поддерживающее PowerShell, с помощью сценария PowerShell (.ps1).

mklement0 07.08.2024 23:03

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