2015-06-29 3 views
0

Мне нужно создать командный файл в окнах для анализа всех имен файлов, доступных в папке, и переместить файлы, соответствующие некоторым условиям, в папку. Я уже создал цикл цикла с помощью команды FOR, и я установил имя файла для переменной. Теперь мне нужно проверить, сколько «-» символов hypen находятся в переменной имени файла; если вхождения этого символа больше 10, файл не должен перемещаться. Кроме того, мне нужно также проверить, есть ли место внутри имени файла: также в этом случае файл не может быть перемещен. Просьба: каким образом я могу создать скрипт для проверки числа вхождений hypen в переменной и наличия символа пробела?Количество вхождений символа в строке (командный файл)

Большое спасибо

ответ

0

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

1. Save the length of the original string 
2. Remove all hyphens from the string 
3. Compare the length of the new string to that of the original: 
     originalLength - newLength = numberOfHyphens 

Аналогичным образом этот метод может использоваться для определения наличия пространства. Если длина исходной строки больше длины строки минус пробелы, то пространство должно быть удалено и, следовательно, должно существовать в исходной строке.

+0

Здравствуйте ваш подход хорош, но, к сожалению, я не знаю, как проверьте длину строки и удалите дефисы из строки. Спасибо. – bantonacci

+0

Привет, кто бы ни зашел, пожалуйста, объясните почему? Если мой подход неправильный или бесполезный, я хотел бы знать, как сделать его лучше. – DesAdams

+1

@DesAdams Я согласен, что ваша техника должна работать. Я подозреваю, что он был заблокирован, потому что вы не представили пример. – Tony

0

Если я вас правильно понял, вы действительно не хотите, чтобы узнать, сколько hypens имя есть, но просто знать, если имя более 10 hypens. Это может быть легко достигнуто с помощью "tokens=12 delims=-" опции for /F команды:

EDIT: Измененный код соответственно нового запроса заявил в комментарии. Новый код проверяет, содержит ли имя ровно 10 hypens и не включает пробел.

@echo off 
setlocal 

for %%a in (one-two-three-four-five-six-seven-eight-nine-end.txt 
      one-two-three-four-five-six-seven-eight-nine-ten-end.txt 
      one-two-three-four-five-six--eight-nine-ten-end.txt 
      one-two-three-four-five---eight-nine-ten-end.txt 
      one-two-three-four-five----nine-ten-end.txt 
      one-two-three-four-five-----ten-end.txt 
      one----------end.txt 
      ----------.txt 
      one-two-three-four-five-six-seven-eight-nine-ten-eleven-end.txt 
      "one-two-three-four-five-SIX SEVEN--eight-nine-ten-end.txt") do (
    set "fileName=%%~a" 
    call :checkName 
) 
goto :EOF 


:checkName 
echo Checking "%fileName%" 
set "result=Don't have 10 hypens" 
for /F "tokens=11,12 delims=-" %%a in ("%filename:--=X-X-X%") do (
    if "%%a" neq "" if "%%b" equ "" set "result=Name correct" 
) 
for /F "tokens=2" %%a in ("%fileName%") do if "%%a" neq "" set "result=Include space" 
echo %result% 
exit /B 
+0

Этот подход не удастся, если некоторые из символов hypen являются последовательными. –

+0

Прежде всего спасибо. Я не очень хорошо объяснил свою потребность. Мне нужно исключить имена файлов, которые не имеют десяти дефис (поэтому имя файла должно иметь 10 подстановок и не более или менее), а два последовательных дефиса должны считаться двумя дефисом. Следует также учитывать наличие пространства или большего количества пробелов. Благодаря ! – bantonacci

+0

См. Редактирование в моем ответе. Вы не должны указывать новые спецификации в комментариях, но вместо этого изменить исходный вопрос и просто оставить комментарий в качестве совета, который изменил спецификацию. – Aacini

1

Этот код использует только 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 
+0

Прежде всего спасибо. Я не очень хорошо объяснил свою потребность. Мне нужно исключить имена файлов, которые не имеют десяти дефис (поэтому имя файла должно иметь 10 подстановок и не более или менее), а два последовательных дефиса должны считаться двумя дефисом. Следует также учитывать наличие пространства или большего количества пробелов. Благодаря ! – bantonacci

+0

@ bantonacci, ответ обновлен. –

Смежные вопросы