- Windows cmd длина строки
- ЗАМЕНА ОДНОЙ ПОДСТРОКИ НА ДРУГУЮ В ФАЙЛЕ
- Вывод на экран, в файл текста без перевода строки
- Вычисление длины строковой переменной
- Получение подстроки.
- Удаление ведущих и замыкающих пробелов.
- CMD/BAT: Нахождение длины строки
- Сообщения 21
- 1 Тема от Arigato 2013-01-06 16:14:06
- Тема: CMD/BAT: Нахождение длины строки
- 2 Ответ от wisgest 2013-01-06 21:08:00 (изменено: wisgest, 2013-01-06 21:15:36)
- Re: CMD/BAT: Нахождение длины строки
- Командная подсказка (Cmd. exe) ограничение строки командной строки
- Дополнительные сведения
- Примеры
- Как обойти ограничение
- Windows cmd длина строки
- ЗАМЕНА ОДНОЙ ПОДСТРОКИ НА ДРУГУЮ В ФАЙЛЕ
- Вывод на экран, в файл текста без перевода строки
- Вычисление длины строковой переменной
- Получение подстроки.
- Удаление ведущих и замыкающих пробелов.
Windows cmd длина строки
1 EXIT /b for %%a in («A=a» «B=b» «C=c» «D=d» «E=e» «F=f» «G=g» «H=h» «I=i» «J=j» «K=k» «L=l» «M=m» «N=n» «O=o» «P=p» «Q=q» «R=r» «S=s» «T=t» «U=u» «V=v» «W=w» «X=x» «Y=y» «Z=z» «А=а» «Б=б» «В=в» «Г=г» «Д=д» «Е=е» «Ж=ж» «З=з» «И=и» «К=к» «Л=л» «М=м» «Н=н» «О=о» «П=п» «Р=р» «С=с» «Т=т» «У=у» «Ф=ф» «Х=х» «Ц=ц» «Ч=ч» «Ш=ш» «Щ=щ» «Ь=ь» «Ы=ы» «Ъ=ъ» «Э=э» «Ю=ю» «Я=я») do ( call set %
ЗАМЕНА ОДНОЙ ПОДСТРОКИ НА ДРУГУЮ В ФАЙЛЕ
Для выполнения этой операции можно использовать утилиту sbs2.com
Традиция и дошедший комментарий приписывает авторство Herbert Kleebauer. Получить эту программку можно выполнив следующий бат файл:
x>viH>`LYNBGyA?@xAB?sUq`>>sbs2.com
echo LRy@PwtCYQEuFK@A
BxPtDss@fFqjVmzD@qBEOEenU?`eHHeBCMs?FExep>>sbs2.com
echo LHsPBGyA?@xAunjzA>EKNs@CA?wQpQpKLBHv?s`WJ`LRCYyIWMJaejCksl>>sbs2.com
echo H[GyFGhHBwHZjjHeoFasuFUJeHeB?OsQH[xeHCPvqFj@oq@eNc?
>>sbs2.com
echo CK>Ayre
В результате, в папке, где будет запущен приведенный выше текст, создастся файл sbs2.com.
Возможно, вы будете приятно удивлены его размером — 659 БАЙТ!
Те, кому вышеприведенные изыски кажутся излишними, могут скачать готовую утилиту здесь.
Использование:
sbs2.com 0 «Old String» «New String» outfile
Осуществляется замена всех вхождений Old String на New String в файле infile. Результат запишется в файл outfile.
Такую задачу можно решить без использования сторонних программ, только средствами bat !
Ниже приведен пример с использованием локальной процедуры txtrepl
Вывод на экран, в файл текста без перевода строки
В bat/cmd командах не предусмотрена возможность вывода данных без перевода строки. Но для решения такой задачи можно использовать некую уловку.
Команда set с параметром, предусматривающим ввод данных с экрана, позволяет вывести подсказку для ввода без перевода строки. Вот этим мы и воспользуемся.
b.txt
Использование этого приема в сочетании с символом backspace (код 08) позволяет сделать вывод на экран изменяемого текста и как вариант — «вращающейся палки».
Вычисление длины строковой переменной
В bat/cmd командах нет функции, позволяющей вычислять длину строковой переменной. А такая задача возникает не так уж и редко. Однако средств командного языка достаточно, для того что бы решить такую задачу, не прибегая к использованию специальных программ. Рассмотрим несколько вариантов решения данной задачи:
1 :startvarcount if not defined var exit /b set var=%var:
1% set /a %2+=1 goto startvarcount exit /b
Еще один вариант вычисления длины строковой переменной:
1″ GoTo :EOF :StringLenLoop Set /A $StringLen+=1 Call Set $StringChr=%%$StringBuf:
%$StringLen%%% If «»==»%$StringChr%» GOTO :EOF GoTo :StringLenLoop
Еще один способ определения длины строки, как ни странно — достаточно быстрый:
n0.tmp» For %%i In («%TEMP%\%
n0.tmp») Do Set /A z=%%
Ну и, наконец, решение, поразившее меня своей математической лаконичностью:
1!»&rem keep the A up front to ensure we rem get the length and not the upper bound rem it also avoids trouble in case of empty string set «len=0» for /L %%A in (12,-1,0) do ( set /a «len|=1% >» 1 call set sim=%%str:
!BB!,1%% if «!sim!» == «» ( set /a mmax=!BB!) else ( set /a mmin=!BB! ) ) ENDLOCAL & SET /a %
2=%mmin% EXIT /b %mmin%
Получение подстроки.
Если смещение начала подстроки и ее длина являются константами — здесь все достаточно просто и аналогичный пример рассматривался выше:
Прошу прощения, если в качестве значения переменной str я опубликовал чей-то пароль )).
Если же одна или обе эти величины — переменные, то решение будет не столь простое.
Здесь встретиться возможно не совсем обычное применение команды CALL. Немного глубже об этом на странице Полезное в разделе Особенности использования команды CALL. Там же рассмотрен и этот пример.
Итак, рассмотрим возможные решения:
Или как вариант предыдущего
Удаление ведущих и замыкающих пробелов.
%curpos%,1! if «!SUBD!» == «» GoTo :formrez if NOT «!SUBD!» == » » ( if !firstnoblank! == -1 set firstnoblank=!curpos! set lastnoblank=!curpos! ) set /a curpos = !curpos!+1 GoTo :StringLenLoop :formrez set /a n1=!firstnoblank!-1 set /a n2=!lastnoblank!-!firstnoblank!+1 if !firstnoblank! == -1 (set «rez=») else (set rez=!%1:
CMD/BAT: Нахождение длины строки
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Сообщения 21
1 Тема от Arigato 2013-01-06 16:14:06
- Arigato
- Разработчик
- Неактивен
- Рейтинг : [ 0 | 0 ]
Тема: CMD/BAT: Нахождение длины строки
Именно такой темы в коллекции нет, хотя в некоторых других темах этот вопрос косвенно подымался. Думаю, что решение данной задачи должно содержаться в коллекции.
Существуют разные способы, как найти длину строки. Рассмотрим их и проведем анализ производительности. В конечном счете выбор должен пасть на самый быстрый вариант решения.
Для замера производительности я использовал следующий шаблон:
Т.е. будем запускать функцию определения длины строки 100 раз и замерять время работы. Определять будем длину переменной %Path%, в моем случае она составляет 388 символов — достаточно длинная строка.
Первый вариант решения задачи (решение в лоб):
Отработал за 1602, т.е. 16 секунд.
Второй вариант (записываем строку в файл, после чего определяем размер файла):
Этот вариант отработал за 33, т.е. существенно меньше секунды. Идея создание временного файла взята из обсуждения в этой теме: http://forum.script-coding.com/viewtopic.php?id=7944
Чем же так плох первый вариант? Возможно это связано с циклом goto. В любом случае остановиться надо на втором варианте.
2 Ответ от wisgest 2013-01-06 21:08:00 (изменено: wisgest, 2013-01-06 21:15:36)
- wisgest
- Разработчик
- Неактивен
- Рейтинг : [ 25 | 0 ]
Re: CMD/BAT: Нахождение длины строки
Именно такой темы в коллекции нет, хотя в некоторых других темах этот вопрос косвенно подымался. Думаю, что решение данной задачи должно содержаться в коллекции.
Да, именно такой темы — нет. Вопрос поднимался, причём, отнюдь не косвенно. Да — должно содержаться. Причём, наряду с другими возможными решениями, на мой взгляд, должно присутствовать и «решение в лоб». Хотя не уверен, что следовало бы создавать отдельную тему, может быть, лучше было бы собрать в одну тему различные функции обработки строк, например, кроме нахождения длины: поиск вхождения подстроки, может быть, Trim…
По поводу второго варианта. Создание каталога, там где можно ограничится лишь файлом, представляется избыточным. Можно воспользоваться тем, что пока файл открыт на запись, любые посторонние попытки его изменения вызовут ошибку:
(и этот подход мне представляется более надёжным.)
Замеров времени я не проводил, но чисто умозрительно — должно быть чуть-чуть быстрее.
Командная подсказка (Cmd. exe) ограничение строки командной строки
В этой статье обсуждается ограничение длины строк, которые вы используете из командной строки в командной строке (Cmd.exe). Он также предоставляет методы, которые можно использовать для работы над этим ограничением.
Оригинальная версия продукта: Windows Server 2012 R2, Windows Server 2008 R2 Пакет обновления 1, Windows 7 Пакет обновления 1
Исходный номер КБ: 830473Дополнительные сведения
Максимальная длина строки, которую можно использовать в командной строке, — 8191 символ.
Это ограничение применяется к:
- командная строка
- отдельные переменные среды, унаследованные другими процессами, такими как переменная PATH
- все расширения переменных среды
Если для запуска пакетных файлов используется командная подсказка, это ограничение также применяется к пакетной обработке файлов.
Примеры
В следующих примерах покажите, как это ограничение применимо к командам, запускаемой в командной подсказке, и командам, которые используются в пакетном файле.
В командной строке общая длина следующей командной строки не может содержать более 8191 символов:
В пакетном файле общая длина следующей командной строки не может содержать более 8191 символов:
Это ограничение применяется к строкам команд, которые содержатся в пакетных файлах при использовании командной строки для запуска пакетного файла.
В командной подсказке общая длина после расширения не может содержать более EnvironmentVariable1 EnvironmentVariable2 EnvironmentVariable3 8191 символов:
В пакетном файле общая длина следующей командной строки после расширения параметров не может содержать более 8191 символов:
Несмотря на то, что ограничение Win32 для переменных среды составляет 32 767 символов, Командная подсказка игнорирует любые переменные среды, унаследованные от родительского процесса и более длинные, чем собственные ограничения в 8191 символы (как это необходимо для операционной системы). Дополнительные сведения о SetEnvironmentVariable функции см. в функции SetEnvironmentVariableA.
Как обойти ограничение
Чтобы обойти ограничение, используйте один или несколько из следующих методов, соответствующих ситуации:
Измените программы, которые требуют длинных командных строк, чтобы они использовали файл, содержащий сведения о параметре, а затем включили имя файла в командную строку.
Например, вместо использования командной строки в пакетном файле измените программу, чтобы использовать командную строку, аналогичную следующей командной строке, где ParameterFile — это файл, содержащий необходимые параметры ExecutableFile.exe Parameter1 Parameter2. ParameterN (parameter1 parameter2. ParameterN):
Измените программы, в которых используются большие переменные среды, чтобы переменные среды содержали менее 8191 символов.
Например, если переменная среды PATH содержит более 8191 символов, используйте один или несколько следующих методов, чтобы уменьшить число символов:
- Используйте более короткие имена для папок и файлов.
- Уменьшите глубину деревьев папок.
- Храните файлы в меньшем числе папок, чтобы в переменной среды PATH требовалось меньше папок.
- Изучите возможные методы, которые можно использовать для снижения зависимости PATH для размещения файлов dll.
—>
Windows cmd длина строки
1 EXIT /b for %%a in («A=a» «B=b» «C=c» «D=d» «E=e» «F=f» «G=g» «H=h» «I=i» «J=j» «K=k» «L=l» «M=m» «N=n» «O=o» «P=p» «Q=q» «R=r» «S=s» «T=t» «U=u» «V=v» «W=w» «X=x» «Y=y» «Z=z» «А=а» «Б=б» «В=в» «Г=г» «Д=д» «Е=е» «Ж=ж» «З=з» «И=и» «К=к» «Л=л» «М=м» «Н=н» «О=о» «П=п» «Р=р» «С=с» «Т=т» «У=у» «Ф=ф» «Х=х» «Ц=ц» «Ч=ч» «Ш=ш» «Щ=щ» «Ь=ь» «Ы=ы» «Ъ=ъ» «Э=э» «Ю=ю» «Я=я») do ( call set %
ЗАМЕНА ОДНОЙ ПОДСТРОКИ НА ДРУГУЮ В ФАЙЛЕ
Для выполнения этой операции можно использовать утилиту sbs2.com
Традиция и дошедший комментарий приписывает авторство Herbert Kleebauer. Получить эту программку можно выполнив следующий бат файл:
x>viH>`LYNBGyA?@xAB?sUq`>>sbs2.com
echo LRy@PwtCYQEuFK@A
BxPtDss@fFqjVmzD@qBEOEenU?`eHHeBCMs?FExep>>sbs2.com
echo LHsPBGyA?@xAunjzA>EKNs@CA?wQpQpKLBHv?s`WJ`LRCYyIWMJaejCksl>>sbs2.com
echo H[GyFGhHBwHZjjHeoFasuFUJeHeB?OsQH[xeHCPvqFj@oq@eNc?
>>sbs2.com
echo CK>Ayre
В результате, в папке, где будет запущен приведенный выше текст, создастся файл sbs2.com.
Возможно, вы будете приятно удивлены его размером — 659 БАЙТ!
Те, кому вышеприведенные изыски кажутся излишними, могут скачать готовую утилиту здесь.
Использование:
sbs2.com 0 «Old String» «New String» outfile
Осуществляется замена всех вхождений Old String на New String в файле infile. Результат запишется в файл outfile.
Такую задачу можно решить без использования сторонних программ, только средствами bat !
Ниже приведен пример с использованием локальной процедуры txtrepl
Вывод на экран, в файл текста без перевода строки
В bat/cmd командах не предусмотрена возможность вывода данных без перевода строки. Но для решения такой задачи можно использовать некую уловку.
Команда set с параметром, предусматривающим ввод данных с экрана, позволяет вывести подсказку для ввода без перевода строки. Вот этим мы и воспользуемся.
b.txt
Использование этого приема в сочетании с символом backspace (код 08) позволяет сделать вывод на экран изменяемого текста и как вариант — «вращающейся палки».
Вычисление длины строковой переменной
В bat/cmd командах нет функции, позволяющей вычислять длину строковой переменной. А такая задача возникает не так уж и редко. Однако средств командного языка достаточно, для того что бы решить такую задачу, не прибегая к использованию специальных программ. Рассмотрим несколько вариантов решения данной задачи:
1 :startvarcount if not defined var exit /b set var=%var:
1% set /a %2+=1 goto startvarcount exit /b
Еще один вариант вычисления длины строковой переменной:
1″ GoTo :EOF :StringLenLoop Set /A $StringLen+=1 Call Set $StringChr=%%$StringBuf:
%$StringLen%%% If «»==»%$StringChr%» GOTO :EOF GoTo :StringLenLoop
Еще один способ определения длины строки, как ни странно — достаточно быстрый:
n0.tmp» For %%i In («%TEMP%\%
n0.tmp») Do Set /A z=%%
Ну и, наконец, решение, поразившее меня своей математической лаконичностью:
1!»&rem keep the A up front to ensure we rem get the length and not the upper bound rem it also avoids trouble in case of empty string set «len=0» for /L %%A in (12,-1,0) do ( set /a «len|=1% >» 1 call set sim=%%str:
!BB!,1%% if «!sim!» == «» ( set /a mmax=!BB!) else ( set /a mmin=!BB! ) ) ENDLOCAL & SET /a %
2=%mmin% EXIT /b %mmin%
Получение подстроки.
Если смещение начала подстроки и ее длина являются константами — здесь все достаточно просто и аналогичный пример рассматривался выше:
Прошу прощения, если в качестве значения переменной str я опубликовал чей-то пароль )).
Если же одна или обе эти величины — переменные, то решение будет не столь простое.
Здесь встретиться возможно не совсем обычное применение команды CALL. Немного глубже об этом на странице Полезное в разделе Особенности использования команды CALL. Там же рассмотрен и этот пример.
Итак, рассмотрим возможные решения:
Или как вариант предыдущего
Удаление ведущих и замыкающих пробелов.
%curpos%,1! if «!SUBD!» == «» GoTo :formrez if NOT «!SUBD!» == » » ( if !firstnoblank! == -1 set firstnoblank=!curpos! set lastnoblank=!curpos! ) set /a curpos = !curpos!+1 GoTo :StringLenLoop :formrez set /a n1=!firstnoblank!-1 set /a n2=!lastnoblank!-!firstnoblank!+1 if !firstnoblank! == -1 (set «rez=») else (set rez=!%1: