1

Тема: CMD/BAT: Удаление лидирующих и завершающих пробелов

Доброго времени суток.

Необходимо из значения строковой переменной удалить лидирующие и завершающие пробелы
Значение переменной берется из внешнего файла в цикле


setlocal enableExtensions enableDelayedExpansion
for /f "tokens=1,2" %%i in (%inputFile%) do (set str=%%i)

Длина строки заранее не известна.
Вариант


setlocal enableExtensions enableDelayedExpansion
for /f "tokens=1,2" %%i in (%inputFile%) do (
   set str=%%j
   set str=!str: =!
)

не подходит, потому как внутри строки пробелы присутствовать могут как часть значания. Удалить нужно именно лидирующие и завершающие.
И еще один вопрос: как с помощью команды


echo

вывести в файл символ табуляции ?

2 (изменено: Yury, 2014-03-16 00:55:36)

Re: CMD/BAT: Удаление лидирующих и завершающих пробелов

Нужно "обрезать" как все начальные, так и все концевые пробелы? Чтобы иметь минимум проблем со специальными символами и не иметь проблем с восклицательным знаком, предложу такой вариант:

@echo off
set inputFile=1.txt
set outputFile=2.txt
(
for /f "usebackq delims=" %%i in ("%inputFile%") do (
  set /p"=%%i"<nul| findstr /evc:" "|| (
   set "str=%%i"
   call:#
  )
 )
)>%outputFile%
exit /b

:#
call set "str=%%str:~,-1%%"
call set /p"=%%str%%"<nul| findstr /evc:" "|| (
 goto:#
)
exit /b

.


s76 пишет:

как с помощью команды

echo

вывести в файл символ табуляции ?

echo.    >example.txt

3

Re: CMD/BAT: Удаление лидирующих и завершающих пробелов

Начальные пробелы не убираются, чтобы они убирались надо было вместо
«DELIMS=» указать «TOKENS=*».

+ открыть спойлер

В теме «CMD/BAT: перекодировка текста dos866&#8596;win1251» в Коллекции, кстати, наоборот, на что я указывал:

wisgest пишет:

решение от 01MDM имеет полное право на существование в Коллекции, хотя и не лишено недостатков, как неустранимых (…), так и устранимых, которые следовало бы убрать, подправив тему без создания новых сообщений (не помню, то ли не обрабатываются пробелы в начале строк…).

4 (изменено: Yury, 2014-03-18 13:01:00)

Re: CMD/BAT: Удаление лидирующих и завершающих пробелов

wisgest пишет:

Начальные пробелы не убираются, чтобы они убирались надо было вместо
«DELIMS=» указать «TOKENS=*».


Я специально, чтобы спровоцировать такое замечание (уж извините), из начального текста своего кода убрал "tokens=*" и вставил в публикуемый код "delims=".

Команда "set /p", в оличие от команды "echo", всегда самостоятельно убирает все начальные пробелы.

Проверьте:

set /p=     123 456 789     

, или

set /p="     123 456 789     "

, или

set /p"=     123 456 789     "

.

5 (изменено: wisgest, 2014-03-18 13:16:49)

Re: CMD/BAT: Удаление лидирующих и завершающих пробелов

То, что пробелы в начале строки не убираются было проверено на опыте, т.к. допускал, что чего-то недопонял.

Yury пишет:

Команда "set /p", в оличие от команды "echo", всегда самостоятельно убирает все начальные пробелы.

Проверьте:

Только во втором случае.

6 (изменено: Yury, 2014-03-18 13:44:03)

Re: CMD/BAT: Удаление лидирующих и завершающих пробелов

wisgest пишет:

То, что пробелы в начале строки не убираются было проверено на опыте, т.к. допускал, что чего-то недопонял.

Совершенно верно, но это справедливо для команды "echo", команды "set" без ключа "/p" и т. п., но не для команды "set" с ключом "/p".


wisgest пишет:

Только во втором случае.

Во всех трёх случаях начальные пробелы не сохраняются.

Проверьте ещё так:

(
<nul set /p=     123 456 789     
echo.
<nul set /p="     123 456 789     "
echo.
<nul set /p"=     123 456 789     "
)>.txt

7

Re: CMD/BAT: Удаление лидирующих и завершающих пробелов

wisgest, по-моему, у нас разные версии интерпретатора.

8

Re: CMD/BAT: Удаление лидирующих и завершающих пробелов

Yury пишет:

wisgest, по-моему, у нас разные версии интерпретатора.

5.1.2600.5512

9

Re: CMD/BAT: Удаление лидирующих и завершающих пробелов

6.1.7601.17514

10

Re: CMD/BAT: Удаление лидирующих и завершающих пробелов

Yury пишет:

6.1.7601.17514

Налицо ухудшение, что в очередной раз подтверждает, что новое — не значит лучшее  (по крайней мере, во всех отношениях).

11 (изменено: wisgest, 2014-03-18 19:22:14)

Re: CMD/BAT: Удаление лидирующих и завершающих пробелов

Ладно, с начальными пробелами разобрались (на мой взгляд, по итогам разбора должны быть сделаны какие-то примечания в теме «CMD/BAT: вывод текста без переноса на новую строку»), примемся за конечные.

Yury, почему так сложно? Коль в коде присутствует преобразование переменной цикла %%i в переменную среды %str%, то почему просто последовательно не проверять её последний знак %str:~-1%? Что даёт использование FINDSTR?

12

Re: CMD/BAT: Удаление лидирующих и завершающих пробелов

Yury пишет:

не иметь проблем с восклицательным знаком

При отключенном отложенном расширении переменных среды и, соответственно, при двойном раскрытии переменных конструкции с оператором условного выполнения команд невозможны. Поэтому команда "findstr" здесь является своеобразной заменой оператору "if".

Кстати, догадайтесь, что я использую для замены конструкции "if exist".

13

Re: CMD/BAT: Удаление лидирующих и завершающих пробелов

на мой взгляд, по итогам разбора должны быть сделаны какие-то примечания в теме «CMD/BAT: вывод текста без переноса на новую строку»

wisgest, добавляйте.

+ открыть спойлер

Я тут насилу научился-таки корректно разбирать юникодный вывод «wmic.exe» wink.

14

Re: CMD/BAT: Удаление лидирующих и завершающих пробелов

alexii пишет:

wisgest, добавляйте.

Ну, материала на самодостаточное сообщение маловато, я предпологал добавление небольшого постскриптума к уже имеющемуся его автором smile.

Yury пишет:

Кстати, догадайтесь, что я использую для замены конструкции "if exist".

+ открыть спойлер
REM set file_exists=
for %%F in ("имя файла") do (
  echo Искомый файл расположен в каталоге "%%~dpF"
  REM set file_exists=1
)
REM if not defined file_exists (echo Файл не найден)
alexii пишет:

Я тут насилу научился-таки корректно разбирать юникодный вывод «wmic.exe»

+ открыть спойлер

В каком окружении (WSH, CMD…); вывод перенаправленный в файл, в конвейер, перехватываемый с помощью FOR/F?

15

Re: CMD/BAT: Удаление лидирующих и завершающих пробелов

Yury пишет:

не иметь проблем с восклицательным знаком

Вроде бы, так их нет:

@echo off
setlocal disabledelayedexpansion
set inputFile=1.txt
set outputFile=2.txt
(for /f "usebackq tokens=*" %%i in ("%inputFile%") do (
   set "str=%%i"
   call :#
))>"%outputFile%"
endlocal
exit /b

:#
setlocal enabledelayedexpansion
set i=0
:#1
  set /a i-=1
  if "!str:~%i%,1!"==" " goto #1
set /a i+=1
if %i% equ 0 (echo:!str!) else echo:!str:~0^,%i%!
endlocal
exit /b

— кажется, выполняется чуть быстрее и не спотыкается на строке
«I said "Hi & bye"».

16

Re: CMD/BAT: Удаление лидирующих и завершающих пробелов

wisgest пишет:

Ну, материала на самодостаточное сообщение маловато, я предпологал добавление небольшого постскриптума к уже имеющемуся его автором smile.

Там в постах и так избыток материала. Так что смело добавляйте отдельным постом.

wisgest пишет:

В каком окружении (WSH, CMD…); вывод перенаправленный в файл, в конвейер, перехватываемый с помощью FOR/F?

+ открыть спойлер

В пакетных файлах. Как избавиться от удвоения символа Cr при разборе по «for /f» без промежуточных файлов:

for /f "usebackq tokens=2 delims==" %i in (`wmic.exe UserAccount where "LocalAccount='True' AND Disabled='False'" get Name /value`) do @echo [%i]

Оказалось банально, двойным разбором:

for /f "usebackq tokens=2 delims==" %i in (`wmic.exe UserAccount where "LocalAccount='True' AND Disabled='False'" get Name /value`) do @for /f %j in ("%i") do @echo [%j]

17

Re: CMD/BAT: Удаление лидирующих и завершающих пробелов

alexii пишет:

Так что смело добавляйте отдельным постом.

Так как сам я описанное поведение воочию пока не наблюдал, то смело не могу.
Лучше пусть кто-нибудь их тех, кто наблюдал.
Коль первым об этой особенности упомянул Yury, то это мог бы сделать он, если присудить ему степень разработчика в связи с деятельной помощью другим участникам и искушённостью в командных файлах.

18

Re: CMD/BAT: Удаление лидирующих и завершающих пробелов

wisgest пишет:

Ладно, с начальными пробелами разобрались (на мой взгляд, по итогам разбора должны быть сделаны какие-то примечания в теме «CMD/BAT: вывод текста без переноса на новую строку»)…

wisgest пишет:

Коль первым об этой особенности упомянул Yury, то это мог бы сделать он…

19

Re: CMD/BAT: Удаление лидирующих и завершающих пробелов

alexii пишет:
+ открыть спойлер

В пакетных файлах. Как избавиться от удвоения символа Cr при разборе по «for /f» без промежуточных файлов:

for /f "usebackq tokens=2 delims==" %i in (`wmic.exe UserAccount where "LocalAccount='True' AND Disabled='False'" get Name /value`) do @echo [%i]

Оказалось банально, двойным разбором:

for /f "usebackq tokens=2 delims==" %i in (`wmic.exe UserAccount where "LocalAccount='True' AND Disabled='False'" get Name /value`) do @for /f %j in ("%i") do @echo [%j]

Можно передать вывод на MORE или SORT

+ открыть спойлер
for /f "usebackq tokens=2 delims==" %i in (`wmic.exe UserAccount where "LocalAccount='True' AND Disabled='False'" get Name /value`) do @echo [%i]|more
for /f "usebackq tokens=2 delims==" %i in (`wmic.exe UserAccount where "LocalAccount='True' AND Disabled='False'" get Name /value`) do @echo [%i]|sort