Как я могу увидеть, если строка состоит из четырех букв? - Windows Batch - PullRequest
1 голос
/ 29 октября 2019

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

Я попробовал следующее, но это не сработало ...

for /R "%windir%\system32" %%f in (*) do (
    set filename=%%~nf

    if not "!filename!"=="!filename:[a-z][a-z][a-z][a-z]=!" (
        echo %%~nf
    )
)

Так что мой код перебирает все файлы в \system32. Файлы вроде mode.com должны отображаться, но это не так.

Ответы [ 4 ]

4 голосов
/ 29 октября 2019

Это работает:

dir /B "%windir%\system32" | findstr "^[a-z][a-z][a-z][a-z]\."

Проверено на Windows 10

1 голос
/ 30 октября 2019

Попробуйте это:

dir /b C:\Windows\system32 | findstr /r "[a-z][a-z][a-z][a-z]"

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

1 голос
/ 29 октября 2019

Как подразумевается в моем комментарии, и предполагается, что четыре символа, а не четыре буквенных символа:

@For /R "%__AppDir__%" %%A In (*)Do @(Set "FN=%%~nA"
    SetLocal EnableDelayedExpansion
    If Not "%%~nA"=="!FN:~,3!" If "%%~nA"=="!FN:~,4!" Echo %%~nA
    EndLocal)

И вот возможная альтернатива для четырех буквенных символов. Запустите его как администратор, если вы действительно пытаетесь проанализировать все файлы внутри \Windows\System32\, (необязательно, но может забрать больше файлов) :

@Dir /B/S/A-D "%__AppDir__%" 2>NUL|"%__AppDir__%findstr.exe" "\\[a-Z][a-Z][a-Z][a-Z]\.[^\.]*$ \\[a-Z][a-Z][a-Z][a-Z]$"

Вы можете поместитьчто внутри , если по какой-то необъяснимой причине вам нужны только базовые имена:

@For /F "EOL=?Tokens=*" %%A In ('Dir /B/S/A-D "%__AppDir__%" 2^>NUL^|"%__AppDir__%findstr.exe" "\\[a-Z][a-Z][a-Z][a-Z]\.[^\.]*$ \\[a-Z][a-Z][a-Z][a-Z]$"')Do @Echo(%%~nA
1 голос
/ 29 октября 2019

Ответ Аасини является лучшим, когда не требуется рекурсия.

На всякий случай, если вам нужно что-то более гибкое (но гораздо медленнее):

@echo off
for /R "%windir%\system32" %%f in (*) do (
  echo %%~nf|findstr /rix "[a-z][a-z][a-z][a-z]" >nul && (
    echo %%~ff has a 4 letter filename: %%~nf and a size of %%~zf Bytes
  )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...