Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
MMt
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 176
1

Не понимаю, зачем нужны переменные среды и командная строка

12.07.2015, 12:16. Просмотров 1604. Ответов 6
Метки нет (Все метки)

Объясните, пожалуйста на пальцах какой прок от командной строки и переменных окружения. Я читаю Рихтера и тут описано что они есть и как ими манипулировать, но какой практический толк от этой информации?

Спасибо!

Добавлено через 15 часов 24 минуты
Возможно, у меня были галлюцинации в 3 часу ночи, после просмотра СайлентХил. Но тут были 2 ответа в которых содержались ссылки на схожие темы в которых в пылу дискуссий излагали ответы на мои вопросы. Удалили?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.07.2015, 12:16
Ответы с готовыми решениями:

Переменные среды windows
Я только начинаю изучать, для меня все очень сложно. Есть такой код #include...

Командная строка. WinAPI32
Добрый день! Приведите пример ввода данных в командной строке, более 1-го...

WinAPI и командная строка. Функции ввода
Доброго времени суток! Помогите разобраться с WinAPI, а конкретнее с командной...

Зачем нужны функции MapViewOfFile, CreateFileMapping и что в них обозначает слово Map?
Зaчем нужны функции MapViewOfFile, CreateFileMapping и т.д. Что они делают, для...

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

6
casper007
69 / 69 / 58
Регистрация: 12.12.2013
Сообщений: 420
15.07.2015, 15:44 2
Командная строка. Вслушайтесь! "Командная", то есть, выполняет команды. Допустим, вы решили скомпилировать исходники, ваши действия: Открыть командную строку, найти исходник, ввести команду "cl example.cpp", и если компилятор установлен, прописан в переменные среду, то операционная система выполнит нужную операцию. Переменные среды для того и нужны, чтобы система знала где искать ту или иную программу.
0
Rius
Эксперт .NET
5014 / 3243 / 793
Регистрация: 25.05.2015
Сообщений: 9,960
Записей в блоге: 11
Завершенные тесты: 4
15.07.2015, 15:51 3
А также переменные среды могут использоваться при выполнении команды и влиять на её результат.

По поводу СайлентХилла - для незалогинившихся и новичков форум выглядит немного иначе:
Не понимаю, зачем нужны переменные среды и командная строка
1
MMt
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 176
19.07.2015, 15:38  [ТС] 4
спасибо, за ответ. Понятно - я видел бота. С командной строкой все сложнее, не пойму где ее можно "руками потрогать" Буду ломать голову...
0
casper007
69 / 69 / 58
Регистрация: 12.12.2013
Сообщений: 420
19.07.2015, 16:22 5
Цитата Сообщение от MMt Посмотреть сообщение
руками потрогать"
cmd.exe, Developer Command Prompt for VS20XX, где последняя есть надстройка, которая прописывает в path пути до служебных программа (компилятор, и т.п.)
0
Dragokas
Эксперт WindowsАвтор FAQ
17008 / 7064 / 856
Регистрация: 25.12.2011
Сообщений: 10,881
Записей в блоге: 16
20.07.2015, 22:29 6
Лучший ответ Сообщение было отмечено MMt как решение

Решение

MMt, заходите к нам в раздел: http://www.cyberforum.ru/cmd-bat/
Там можно потрогать и руками, и ногами, и посмотреть, и пощупать -))

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

Вариантов ее использования чаще всего 2:
1) ввод команд непосредственно в интерпретатор cmd (Win + R, cmd, каждую команду подтвержать клавишей ENTER).
2) написание пакетного файла (батника (Windows Batch)). Это простой текстовый файл (обычно, в ANSI или OEM) с расширением .cmd или .bat).
Каждая команда пишется с новой строки (как правило).

Как образуется связь?
1) передачей потока данных через канал или перенаправление из файла.
Пример:
Windows Batch file
1
2
3
4
:: канал
echo Data | find.exe "D" && echo Найдено.
:: из файла
< Data.txt Find.exe "D" && echo Letter D is exists in file Data.txt
2) передачей 1 или нескольких аргументов:
Цитата Сообщение от casper007 Посмотреть сообщение
cl example.cpp
cl.exe - программа,
example.cpp - переданный аргумент.

Соответственно в C++, argv[1], будет содержать тот самый аргумент, а argc - их общее кол-во.

3) Через переменные окружения. Поговорим далее...
4) Прочие примитивные способы, такие как запись во внешний файл, а затем считывание его другим процессом (синхронность естественно обязательна). Ком. строка позволяет реализовать ожидание завершения процесса например, так:
Windows Batch file
1
start "" /wait process.exe
Следующим очевидным способом связи - является автоматизация с помощью батника последовательности выполнения различных процессов: например, Вы можете создать батник для сборки проекта. Допустим - компиляция / upx / подписание / бекап.

Но возможности ком. строки не ограничиваются вызовом готовых программ.
В ней есть также несколько встроенных команд, простейшая математика, а в папке c:\windows\system32 достаточно консольных утилит на разный вкус, откуда можно получить доступ как к файловой системе, так и к реестру, WMI... Но это тянет на большую отдельную тему. Частично пытались объять ее здесь.

На счет переменных окружения. Они есть у любого процесса. Environment variables Block.
Если внимательно почитаете на MSDN о функции CreateProcess, то узнаете про их наследование, а также возможность задать процессу свой набор переменных окружения.

Связь с командной строкой здесь вот какая.
Она умеет напрямую манипулировать переменными окружения процесса (в данном случае, cmd.exe).
Соответственно все процессы, которые из-под нее будут стартовать, также наследуют этот блок (если не блокировать спец. ключами).
Введите в интерпретаторе команду set и увидите эти переменные.

На счет - зачем нужны переменные среды?
Целей их использования довольно много. Из тех, что скажу сразу навскидку:
- есть специальные переменные, такие как "Path". Она задает список путей, по которым будет происходить поиск исполняемого файла, если в командной строке опустить (не указывать) полный путь к нему.
TEMP - используется многими программами как путь к папке, где можно складировать временные файлы.
Вообщем введите команду set, дальше поймете.
- Есть множество переменных, указывающий на путь к специальным папкам.
Разработчики часто используют их, что не есть правильно, т.к. легко позволит осуществить атаку на приложение. Верным способом является использование функции SHGetFolderPath / SHGetKnownFolderPath и прочих особых, как GetWindowsDirectory.
- управление слоями совместимости (app compatibility layers).

Ну а в самом интерпретаторе cmd - эти переменные является чем то вроде аналога глобальных переменных ЯВУ.
Тем не менее существуют механизмы виртуализации, которые позволяют очистить измененный блок переменных процесса cmd.exe

Добавлено через 7 часов 6 минут
Про самое главное забыл сказать - связь в обратную сторону.

Пункт 1.

После завершения работы программа может устанавливать код возврата, например:
1) через указание числа, возвращаемого главной функцией (main):
C++
1
return 1;
2) через функцию:
C++
1
ExitProcess 1;
где число 1 - и будет кодом возврата. По-умолчанию, код 0 - успешное завершение программы (EXIT_SUCCESS).
Этот код затем легко получить из командной строки:
Windows Batch file
1
echo %errorlevel%
и в зависимости от этого предпринимать те или иные дальнейшие действия, например,
консольный архиватор вернул код неудачного завершения (все что не равно 0 считается неудачей, обычно),
тогда мы можем закодить пакетный файл прервать дальнейшие действия, а если УСПЕХ сборки, то к примеру, отправить наш собранный бинарник на проверку в VirusTotal (очередной скрипт).
В пакетном файле будет выглядеть очень просто:
Windows Batch file
1
7z a -mx9 -y -o"c:\Backups" Backup001.zip "c:\project\my.exe" && "%appdata%\VTUploader\PhrozenSoft VirusTotal Uploader.exe" /scan "c:\project\my.exe"
&& - выполнить команду справа, если код возврата слева УСПЕХ (0).
|| - выполнить команду справа, если код возврата слева НЕУДАЧА (не 0).

Пункт 2.

CMD умеет делать разбор консольного вывода программы.
Если у Вас тип приложения консольное, то посредством:
C++
1
2
std::cout << "some data" << std::endl;
std::cerr << "some error message" << std::endl;
Вы можете передать данные либо:
1) на экран консоли
2) для синтаксического разбора циклу FOR батника, который в зависимости от текста предпримет те или иные действия (по завершению работы программы, т.е. неинтерактивно).

На счет переменных окружения можете еще почитать статью от Вадима Стеркина и spe******t: Переменные среды в командной строке
(но там больше общие понятия, не связанные с ЯП).
Вспомнил также, что переменные процесса также иногда используют для передачи данных от потока к родительскому процессу при синхронном подходе. Это не очень хорошая практика тем не менее имеет право на существование, если автор понимает все риски и знает, как это использовать правильно.
2
MMt
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 176
21.07.2015, 22:21  [ТС] 7
ух, мне на неделю материала спасибо пошел пробовать)))
0
21.07.2015, 22:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2015, 22:21

Переменные среды
Например, я скачал и разархивировал JDK. Как сделать так, чтобы он был виден...

переменные среды
как мне из папки system, считать файл fi1.txt? помогите товарищи ...

Переменные среды - II
Ребята, вот что у меня получилось. Работает. ...


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

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

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