Вопрос или проблема
Я пытаюсь вывести только UUID в Windows и выполняю следующую команду:
wmic csproduct get uuid | findstr /R “[a-zA-Z0-9]{5}-[a-zA-Z0-9]{5}-[a-zA-Z0-9]{5}-[a-zA-Z0-9]{5}”
Вышеуказанная команда возвращает пустую строку.
Если я сделаю следующее:
wmic csproduct get uuid
То будет выведено следующее:
UUID
uuid-example-9596-dj9v
Я пытаюсь вывести только последнюю строку.
Насколько я знаю, findstr
использует очень простые регулярные выражения, которые не поддерживают квантификаторы, такие как {5}
.
Вам нужно написать в полном объеме:
[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]-[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]-[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]-[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]
Также рекомендую использовать границы слов:
\<[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]-[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]-[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]-[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]\>
Вы можете использовать альтернативы, смотрите: https://stackoverflow.com/q/87350/372239
Просто сделайте это:
wmic csproduct get uuid | findstr "\-"
И вы получите только нужную строку.
Ответ или решение
Для того чтобы корректно извлекать UUID в Windows с использованием командной строки и findstr
, важно понимать несколько особенностей, связанных с синтаксисом регулярных выражений и ограничениями самого findstr
.
1. Проблема с регулярным выражением
Ваше изначальное регулярное выражение, использованное в команде:
wmic csproduct get uuid | findstr /R “[a-zA-Z0-9]{5}-[a-zA-Z0-9]{5}-[a-zA-Z0-9]{5}-[a-zA-Z0-9]{5}”
не сработает, потому что findstr
не поддерживает расширенные синтаксические конструкции, такие как квантификаторы {n}
. Необходимо написать шаблон в более простом виде.
2. Корректный синтаксис
Чтобы отфильтровать UUID, который, как правило, записывается в формате xxxx-xxxx-xxxx-xxxx
(где x
– это буквы и цифры), вам нужно повторить символы один за другим. Полное регулярное выражение в findstr
будет выглядеть следующим образом:
findstr /R "[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]-[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]-[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]-[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]"
3. Использование границ слова
Кроме того, вы можете рассмотреть возможность использования границ слова для более точного поиска, хотя findstr
не поддерживает специальные символы для границ. Однако вы можете обернуть ваш шаблон в символы, которые помогут отфильтровать только те строки, которые содержат UUID:
findstr /R "\<[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]-[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]-[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]-[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]\>"
4. Простой подход
Если ваша цель – просто извлечь строку с UUID, вы можете использовать более простой подход и просто искать знак -
, который присутствует в UUID:
wmic csproduct get uuid | findstr "-"
Этот способ гарантированно выведет строку, содержащую UUID, без необходимости указывать сложные регулярные выражения.
5. Заключение
Подводя итог, для фильтрации UUID в Windows Command Prompt с использованием wmic
и findstr
, лучше всего использовать упрощенные регулярные выражения или просто искать строки, содержащие определённые символы. Помните о ограничениях findstr
и о том, что перегруженные регулярные выражения могут вызвать больше проблем, чем принести пользы.