В этом посте объясняется, как написать с нуля командную строку (cmd) на C++. Мы рассмотрим очень простой вход в систему, директорию, выход и некоторые пользовательские команды (о программе). Вот окончательный результат:

Есть ли у вас учетная запись? да/нет
нет
Ваше имя пользователя будет: MediumUser

Вашим паролем будет: 1234
C:\Users\Name›› exit
Нажмите любую клавишу, чтобы продолжить. . .

Прежде всего откройте Visual Studio или любую другую программу, которая может компилировать C++, а затем создайте новый проект.

Добавляем нужные нам библиотеки:

#include <iostream> // the basic
#include <string> // for entering the commands and login
#include <fstream> //to write a file with users
#include <stdio.h> //for some subprograms
#include <Windows.h> //for some commands( dir, etc.)
#include <filesystem> // to get the path
#define WINDOWS
#ifdef WINDOWS
#include <direct.h>
#define GetCurrentDir _getcwd
#else
#include <unistd.h>
#define GetCurrentDir getcwd
#endif

Теперь давайте добавим пространства имен:

using namespace std::experimental::filesystem;
using namespace std;

После этого мы создадим функции записи и чтения:

ifstream read(“data.in”); //the same as fout
ofstream write(“data.in”, ios_base::app);// we want to append, not to overwrite

А теперь просто добавьте следующее, чтобы иметь возможность получить рабочий каталог (путь):

std::string GetCurrentWorkingDir(void) {
char buff[FILENAME_MAX];
GetCurrentDir(buff, FILENAME_MAX);
std::string current_working_dir(buff);
return current_working_dir;
}

Ниже приведены наши пользовательские команды, мы можем добавить столько, сколько захотим:

void about()
{
cout << “CMD v1.0 BETA\n”;
}

Создадим функцию, проверяющую команду:

void check(char msg[1000])
{
if (strcmp(msg,”about”)==0)// if msg is the same as“about”
about();//load our custom function
else
if (strcmp(msg,”exit”)==0)//if user want to left
system(“pause”);//press any key to continue…
else
system(msg);//if msg is equal with dir,cd, etc.
}

Если текущий пользователь хочет зарегистрироваться? Ниже приведена функция, которая ему нужна:

void create_user()
{
string usr1, pwd1;
cout << “Your username will be: “;
cin >> usr1;
cout << “Your password will be: “;
cin >> pwd1;
write << usr1 << “ “ << pwd1 << endl;// write into our file the new data
}

Нам нужны переменные:

char msg[1000];// the command
string ver,usr,pwd,ac;

Приступаем к главному!

int main()
{

Войдите или зарегистрируйтесь:

cout << “Do you have an account? y/n\n”;
cin >> ac;
if (ac == “n”) {
create_user();
//place here the next step
}
if(ac == “y”)
{
cout << “Username: “;
cin >> usr;
cout << “\nPassword: “;
cin >> pwd;
while (getline(read, ver))
if (usr + “ “ + pwd != ver)
cout << “”;
else
//place here the next step
}

Теперь у нас все готово, кроме одного: командная строка…

while (strcmp(msg, “exit”) != 0)// if command is not exit
{
cout << GetCurrentWorkingDir() << “>> “; // cout curent path and >>
cin >> msg;// read the message
check(msg);// check and execute the command
}

И финал:

read.close(); //close data.in
write.close();// close data.in
return 0;// exit the main
}// finish the program

Теперь мы закончили. Вы можете добавить столько пользовательских команд, сколько захотите, и сделать командную строку идеальной для вас. Мы можем добавить к пути программу *.exe, сгенерированную после компиляции, и использовать наш cmd из основной командной строки! (например, wsl и bash) Если у вас есть предложения, дайте мне их в комментариях.

Удачного кодирования!

Код можно скачать с Pastebin: https://pastebin.com/PCW1TQLU