Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.69/62: Рейтинг темы: голосов - 62, средняя оценка - 4.69
GoldenId
131 / 130 / 64
Регистрация: 11.11.2010
Сообщений: 770
Записей в блоге: 14
Завершенные тесты: 1
#1

Символ переноса строки в переменной окружения

11.09.2012, 16:31. Просмотров 11172. Ответов 7
Метки нет (Все метки)

Всем привет.

Пишу bat-ник по заданию в институте. В принципе все получается, но хотелось бы улучшить код.

Подскажите, можно ли вставить в переменную окружения символ новой строки.

Мне нужно пробежаться по списку всех запущенных процессов и устроить им некую обработку. Список названий процессов могу получить
1) либо в переменной окружения - но тогда они разделены каким-то мною заданным символом, сейчас звездочкой - *,
2) либо в файле - тогда каждое название на своей строке, но работа с файлом меня не совсем устраивает.

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2012, 16:31
Ответы с готовыми решениями:

Добавить символ переноса строки в параметр реестра
Приветствую. Для быстрого создание *.BAT файлов использую вот такой твик...

Как в переменную добавить символ переноса строки?
Здравствуйте. Подскажите, пожалуйста, как сделать так, чтобы в переменную...

[Статья] Дело о заблокированной переменной окружения %PATH%
Дело о заблокированной переменной окружения %PATH%. Автор: Dragokas ...

Создание папок в цикле (с использованием переменной окружения)
Добрый день. Требуется написать программу, в которой ДО цикла for вводится с...

Получить значение системной переменной окружения TEMP
в недрах Windows существуют две переменные окружения с именем ТЕМP: 1)...

7
Dragokas
Эксперт WindowsАвтор FAQ
16945 / 7030 / 855
Регистрация: 25.12.2011
Сообщений: 10,834
Записей в блоге: 16
15.09.2012, 22:45 #2
Цитата Сообщение от GoldenId Посмотреть сообщение
1) либо в переменной окружения - но тогда они разделены каким-то мною заданным символом, сейчас звездочкой - *,
Разделяя их знаком равенства вместо звездочки, Вы можете пройтись по каждому имени процесса так:

1. Из файла proxy 2.ini
Bash
1
2
3
4
@Echo off
set Actual=c:\Users\Alex\proxy 2.ini
for /f "usebackq delims=" %%a in ("%Actual%") do for %%i in (%%a) Do Echo %%i
pause>nul
Из глобальной пользовательской переменной окружения Actual:
Bash
1
2
3
4
@Echo off
set Actual=c:\Users\Alex\proxy 2.ini
for %%i in (%Actual%) Do Echo %%i
pause>nul
Добавлено через 1 минуту
Цитата Сообщение от GoldenId Посмотреть сообщение
2) либо в файле - тогда каждое название на своей строке, но работа с файлом меня не совсем устраивает.
Bash
1
2
3
4
@Echo off
set Actual=c:\Users\Alex\proxy 2.ini
for /f "usebackq delims=" %%a in ("%Actual%") Do Echo %%a
pause>nul
1
GoldenId
131 / 130 / 64
Регистрация: 11.11.2010
Сообщений: 770
Записей в блоге: 14
Завершенные тесты: 1
16.09.2012, 13:35  [ТС] #3
Dragokas,
Цитата Сообщение от Dragokas Посмотреть сообщение
Из глобальной пользовательской переменной окружения Actual:
Bash
1
2
3
4
@Echo off
set Actual=c:\Users\Alex\proxy 2.ini
for %%i in (%Actual%) Do Echo %%i
pause>nul
Выдает
Код
c:\Users\Alex\proxy
2.ini
Цитата Сообщение от GoldenId Посмотреть сообщение
работа с файлом меня не совсем устраивает
0
Dragokas
Эксперт WindowsАвтор FAQ
16945 / 7030 / 855
Регистрация: 25.12.2011
Сообщений: 10,834
Записей в блоге: 16
21.09.2012, 20:58 #4
Честно, не знаю как это сделать.

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

Пример нерационального, но полностью рабочего кода:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
@Echo off
SetLocal EnableDelayedExpansion
 
::Тест - заносим список процессов, разделенных * в переменную
Set Proc=c:\test.exe*2*3*4 4*5*6*7*8*9*10*11*12*13*14*15*16*17*18*19*20*21*22*23*24*25
 
for /f "tokens=1-26 delims=*" %%a in ("%Proc%") do (
  set proc.1=%%a
  set proc.2=%%b
  set proc.3=%%c
  set proc.4=%%d
  set proc.5=%%e
  set proc.6=%%f
  set proc.7=%%g
  set proc.8=%%h
  set proc.9=%%i
  set proc.10=%%j
  set proc.11=%%k
  set proc.12=%%l
  set proc.13=%%m
  set proc.14=%%n
  set proc.15=%%o
  set proc.16=%%p
  set proc.17=%%q
  set proc.18=%%r
  set proc.19=%%s
  set proc.20=%%t
  set proc.21=%%u
  set proc.22=%%v
  set proc.23=%%w
  set proc.24=%%x
  set proc.25=%%y
  set proc.26=%%z
)
 
for /L %%a in (1,1,26) do (
  rem echo %proc.1%
  rem echo proc.%%a
  if defined proc.%%a (
    rem Устраиваем процессу процедуру обработки
    echo Работаем с процессом - !proc.%%a!
  )
) 
pause>nul
Надеюсь, максимум 26 процессов в переменной Вам хватит ...
0
Anonymоus
611 / 91 / 14
Регистрация: 15.08.2012
Сообщений: 62
23.09.2012, 19:40 #5
Лучший ответ Сообщение было отмечено как решение

Решение

Dragokas, я позволил себе пойти немного другим путем, чем Вы. В данном случае, длинна списка с процессами не ограничивается ничем, кроме самой максимальной длинны одиночной переменной, вместо 26 позиций у Вас.
Кроме того, сменён разделитель, причины описаны в комментариях скрипта.
Код
@Echo off
SetLocal EnableDelayedExpansion
 
:: Разделитель сменён мною на ; по следующим причинам - не содержится в именах файлов и путях,
:: не является спецсимволом, на который может некорректно отреагировать интерпретатор
::Тест - заносим список процессов, разделенных ; в переменную
Set Proc=c:\test.exe;2;3;4 4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25

:: Подготавливаем список для работы с циклом
:: Замена разделителя на внутренние кавычки
Set Proc=%Proc:;=" "%
:: Добавка внешних двойных кавычек
Set Proc="%Proc%"

:: Обрабатываем в цикле, пишем каждый процесс в свою переменную
:: Собственно, если запись процессов в переменную не нужна, то
:: можно работать с ними прямо тут и не плодить излишних сущностей
Set i=0
For %%A In (%Proc%) Do (Set /A i+=1&Set $Process_!i!==%%~A)

:: Работаем с записанными ранее процессами
For /F "tokens=2 delims==" %%A In ('Set $Process') Do (
	Echo Doing something with %%A...
)
Pause>nul
6
Dragokas
Эксперт WindowsАвтор FAQ
16945 / 7030 / 855
Регистрация: 25.12.2011
Сообщений: 10,834
Записей в блоге: 16
24.09.2012, 12:23 #6
Anonymоus, еще раз спасибо, что откликнулись на просьбу и нашли для нас время.
0
Eva Rosalene
T for Trans-
4050 / 1589 / 302
Регистрация: 06.01.2013
Сообщений: 4,179
Завершенные тесты: 2
02.01.2014, 19:35 #7
Цитата Сообщение от GoldenId Посмотреть сообщение
либо в переменной окружения - но тогда они разделены каким-то мною заданным символом, сейчас звездочкой - *,
Осторожно! Сейчас будет некропостинг.
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@echo off
setlocal enabledelayedexpansion
call :parse %Actual%
exit /b
:parse
set _cnt=0
set _tmp=%~1
:parse_1
for /f "usebackq tokens=1* delims=*" %%A IN ('%_tmp%') DO (
 set /a _cnt+=1
 set process.!_cnt!=%%~A
 set _tmp=%%~B
)
if defined _tmp goto parse_1
exit /b
1
Dragokas
Эксперт WindowsАвтор FAQ
16945 / 7030 / 855
Регистрация: 25.12.2011
Сообщений: 10,834
Записей в блоге: 16
02.01.2014, 20:09 #8
Все правильно.
Этому способу как раз здесь место.
С НГ, некропостер !!!
1
02.01.2014, 20:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.01.2014, 20:09

Организовать проверку введённой переменной на принадлежность к переменным окружения в цикле
chcp 1251 @echo off setlocal EnableExtensions EnableDelayedExpansion :cycle...

Добавить символы переноса строки
Отправляю в COM3 некоторые данные ( в данном случае число 33 ) Как сделать...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru