Как получить имена файлов файлов в рабочем каталоге с более чем 30 символами в имени файла, записанном в текстовый файл? - PullRequest
0 голосов
/ 19 ноября 2018

Используемый мной код командного файла:

for /r %%f in (*) do (
    echo %%~nf >>testy.txt
)
for /f "tokens=*" %%a in (testy.txt) do (
    set _temp=%%a
    for /f "tokens=30*" %%g in (_temp) do (
        echo large=%%g>>length.txt
    )
)

Он должен создать length.txt с символами на 30-м месте и выше, но он не работает в 3-м цикле for, который должен создать length.txt.

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Пока в вашем каталоге есть стандартные имена файлов с расширениями, вы, вероятно, можете использовать что-то гораздо более простое:

@Where .:"??????????????????????????????*.*">"length.txt"

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

0 голосов
/ 19 ноября 2018

Некоторые вещи намного проще сделать в PowerShell

Быть по теме, завернутым в пакетный файл

:: Q:\Test\2018\11\19\SO_53379317.cmd
Echo off
Set Len=30
For /f "delims=" %%A in ('
  powershell -NoP -C "(Get-ChildItem '%CD%' -File| Where-Object {$_.Name.Length -gt %Len%}).Name.SubString(%Len%)"
') Do Echo %%A

Если вы хотите, чтобы длина диска, путь, имя и расширение были заменены .Name на .FullName
Имя файла без расширения будет .BaseName

Для параметра -File требуется PSv3 + (присутствует в Windows 8+)

0 голосов
/ 19 ноября 2018

Это можно сделать с помощью следующего пакетного файла, если имя не скрытого файла не содержит восклицательный знак.

@echo off
setlocal EnableExtensions EnableDelayedExpansion

(for %%I in (*) do (
    set "FileName=%%~nI"
    if not defined FileName set "FileName=%%~xI"
    if not "!FileName:~30!" == "" echo %%~nxI
))>length.txt

rem Delete length.txt if being an empty file.
for %%I in (length.txt) do if %%~zI == 0 del length.txt
endlocal

Следующий пакетный файл медленнее, но обрабатывает правильные и не скрытые файлыс ! в имени файла.

@echo off
setlocal EnableExtensions DisableDelayedExpansion

(for %%I in (*) do (
    set "FileName=%%~nI"
    if not defined FileName set "FileName=%%~xI"
    setlocal EnableDelayedExpansion
    if not "!FileName:~30!" == "" echo %%~nxI
    endlocal
))>length.txt

rem Delete length.txt if being an empty file.
for %%I in (length.txt) do if %%~zI == 0 del length.txt
endlocal

Оба пакетных файла обрабатывают имя файла, например .htaccess, как файл с именем файла .htaccess и не имеют расширения файла, пока обрабатывается командный процессор Windowsтакие файлы, как имя файла пустое и расширение файла .htaccess.

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

  • del /?
  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • rem /?
  • set /?
  • setlocal /?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...