Этот код использует только for /f
Tokenizer, чтобы определить, является ли файл должен быть скопирован или исключены. В случае hypen, 10 -
символов генерируют 11 токенов, более или менее является причиной исключения. В случае пространства одно пространство генерирует два токена. Это простая часть, но
В пробеге hypen может присутствовать, а for /f
токенизатор обрабатывает последовательные разделители, как только один разделитель, каждый hypen заменяется -#
и имя файла с префиксом #
для обеспечения правильный раскол.
Чтобы выполнить замену строки, нам нужна нормальная переменная, а не сменный параметр for
. Итак, нам нужно отсроченное расширение, чтобы читать содержимое измененной переменной. Но, с задержкой расширения активно, символы !
становятся проблемой, поскольку синтаксический анализатор попытается интерпретировать его как ссылку на переменную. Чтобы избежать этого, отсроченное расширение включается только в случае необходимости и снова отключается.
Чтобы обрабатывать разделение пространства, имя файла имеет префикс и суффикс #
, чтобы гарантировать, что начальное или конечное пространство правильно обработано.
@echo off
setlocal enableextensions disabledelayedexpansion
rem Generate a set of test files
type nul > "0-1-2-3-4-5-6-7-8-9-10-11-12.testFile"
type nul > "0-1-2-3-4-5-6-7-8-9-10-11.testFile"
type nul > "0-1-2-3-4-5-6-7-8-9-10.testFile"
type nul > "0-1-2-3-4-5-6 -7-8-9-10.testFile"
type nul > "0-1-2-3-4-5-6-7-8-9.testFile"
type nul > "-----------.testFile"
type nul > "----------.testFile"
type nul > "!-----------!.testFile"
type nul > "!----------!.testFile"
type nul > "noSpaces.testFile"
type nul > "this file has spaces.testFile"
type nul > "0-1-2-3-4-5!!-6-!!7-8-9-10-11-12.testFile"
type nul > "0-1-2-3-4-5!!-6-!!7-8-9-10-11.testFile"
type nul > "0-1-2-3!!-4-5-6-7-8-9!!-10.testFile"
type nul > "0-1-2-3!!-4-5-6-7-8!-!9.testFile"
type nul > "no!Sp!aces.testFile"
type nul > "this !file! has spaces.testFile"
for %%f in (*) do (
rem The default behaviour is not to exclude the file
set "exclude="
rem Test the hypen conditions
set "fileName=%%~nf"
setlocal enabledelayedexpansion
for /f "tokens=1,11,12 delims=-" %%a in ("#!fileName:-=-#!") do (
endlocal
rem Testing less than 10 hypen
if "%%~b"=="" set "exclude=1"
rem Testing more than 10 hypen
if not "%%~c"=="" set "exclude=1"
)
rem Test if the file name contains a space
for /f "tokens=1,2" %%a in ("#%%~nf#") do if not "%%~b"=="" set "exclude=1"
rem Now we know what to do with the file
if defined exclude (
echo EXCLUDE "%%~ff"
) else (
echo COPY "%%~ff"
)
)
del /q "*.testFile"
Другой способ сделать это, чтобы отфильтровать список файлов, извлекать только те, которые должны быть обработаны
for /f "delims=" %%a in ('
dir /b
^| findstr /v /c:" "
^| findstr /r /x /c:"[^-]*-[^-]*-[^-]*-[^-]*-[^-]*-[^-]*-[^-]*-[^-]*-[^-]*-[^-]*-[^-]*"
') do echo COPY %%~fa
Здравствуйте ваш подход хорош, но, к сожалению, я не знаю, как проверьте длину строки и удалите дефисы из строки. Спасибо. – bantonacci
Привет, кто бы ни зашел, пожалуйста, объясните почему? Если мой подход неправильный или бесполезный, я хотел бы знать, как сделать его лучше. – DesAdams
@DesAdams Я согласен, что ваша техника должна работать. Я подозреваю, что он был заблокирован, потому что вы не представили пример. – Tony