пакетные переменные восклицательные знаки, используемые в dir | Findstr - PullRequest
1 голос
/ 18 февраля 2020

Я пытаюсь найти файлы, которые не соответствуют (в начале имени файла) предопределенным форматам, содержащимся в файле .txt.

У меня есть следующее:

@Echo off
chcp 1254>nul

setlocal DisableDelayedExpansion

    for /f "usebackq tokens=1,2,3* delims=~" %%f in ("%USERPROFILE%\Desktop\xref.txt") do (
    set "DIRNAME=%%f"
    set "DIRNAM2=^%%f"
    set "PATHNAM=%%h"
    set "ALBUMNM=%%g"
    SETLOCAL EnableDelayedExpansion
    IF EXIST !PATHNAM!!DIRNAME! (
    PushD !PATHNAM!!DIRNAME!
    dir /b /a-d "*" | findstr /v /r /c:"!DIRNAM2! -*"
    )
    ENDLOCAL
    )
    pause
    EXIT /b

Это прекрасно работает, за исключением имен файлов, содержащих челки (восклицательные знаки).

Вот пример моего файла .txt (подкаталог ~ имя альбома ~ путь), который генерируется скриптом:

12 Byzantine Rulers. The History of The Byzantine Empire~12 Byzantine Rulers. The History of The Byzantine Empire~g:\test\
17th Century Poetry~17th Century Poetry~g:\test\
1984 (George Orwell)~1984 (George Orwell)~g:\test\
1_2_1~1_2_1~g:\test\
21st Century American Foreign Policy~21st Century American Foreign Policy~g:\test\
99% Invisible~99% Invisible~g:\test\
Communication Matters. That’s Not What I Meant!~Communication Matters. That’s Not What I Meant!~g:\test\

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

Заранее спасибо.


Редактировать. Мои тестовые данные не были достаточно надежными. Команда findstr также не работает (по крайней мере) со следующими символами: é '»¿... то есть PushD возвращает меня в правильный каталог, но FindStr не выполняет его выборку, как ожидалось.

1 Ответ

0 голосов
/ 19 февраля 2020

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

Например:

@Echo Off
SetLocal DisableDelayedExpansion
For /F "UseBackQ Tokens=1-3 Delims=~" %%G In ("%USERPROFILE%\Desktop\xref.txt")Do (
    Set "SUBDIRN=%%G"
    Set "ALBUMNM=%%H"
    Set "PATHNAM=%%I"
    SetLocal EnableDelayedExpansion
    Set SUBDIRN=!SUBDIRN:%%=%%%%!
    Set ALBUMNM=!ALBUMNM:%%=%%%%!
    Set PATHNAM=!PATHNAM:%%=%%%%!
    Set SUBDIRN=!SUBDIRN:’='!
    Set ALBUMNM=!ALBUMNM:’='!
    Set PATHNAM=!PATHNAM:’='!
    Set SUBDIRN=!SUBDIRN:“="!
    Set ALBUMNM=!ALBUMNM:“="!
    Set PATHNAM=!PATHNAM:“="!
    Set SUBDIRN=!SUBDIRN:”="!
    Set ALBUMNM=!ALBUMNM:”="!
    Set PATHNAM=!PATHNAM:”="!
    If Exist "!PATHNAM!!SUBDIRN!\" (
        PushD "!PATHNAM!!SUBDIRN!"
        Dir /B/A-D|FindStr /IVRC:"^!SUBDIRN! -"
    )
    EndLocal
)
Pause
Exit /B

Я не уверен, как копия этого кода в поле кода будет справляйтесь с умными цитатами, но я уверен, что вы поймете идею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...