Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
IIIa66uMEM6eP
заставил Бендера
436 / 292 / 10
Регистрация: 05.12.2010
Сообщений: 1,648
Записей в блоге: 6
#1

Использование bat команд в C++ - C++

04.05.2011, 17:36. Просмотров 1665. Ответов 6
Метки нет (Все метки)

На сколько знаю, для работы с бат функциями нужно использовать функцию system()
но скажем цикл
Код
@echo off
for /D %%f in (*) do echo %%f
(При выполнении данного скрипта на экран будет выведен список всех вложенных директорий.)
Не будет выполнятся.. Что я не правильно делаю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.05.2011, 17:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Использование bat команд в C++ (C++):

Использование Bat команд в С++ try как использовать - C++
try в С++ не ясно :popcorn: //////////////BAT//////////////// ConsoleApplication1.exe 220 458 ...

Работа с двумерными числовыми массивами. Использование указателей. Использование функций пользователя. - C++
Помогите пожалуйста!!!!!!! Сделать три варианта: первый вариант – передача данных между функциями с помощью глобального...

Очередь команд - C++
Доброго врмени суток. Проблема собственно в следующем: как можно на с++ сделать очередь команд? Т.е. допустим в консоли вводится что-то...

разрядность команд - C++
Добрый день, Всех с праздником! Подскажите, пожалуйста, определение термина "разрядность команд". P.S. искал в интернете, ничего...

Анализатор команд - C++
помогите написать анализатор команд на с++

Использование строк.Использование структур - C++
Задачка: Дана строка,состоящая из групп нулей и едениц. Найти и вывести на экран группы с нечетным количеством символов. И еще одна: ...

6
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,385
Записей в блоге: 2
Завершенные тесты: 1
04.05.2011, 19:40 #2
Не знаю синтаксиса bat, но при выполнении этого скрипта, интерпритатор (cmd.exe) ругается на синтаксическую ошибку. Попробовал вот так:
C++
1
2
system("@echo off");
    system("for /D %f in (*) do echo %f  ");
Выводит список вложенных каталогов, но как-то коряво:

Код
C:\Program Files\CodeBlocks\Project's\shit>echo bin
bin

C:\Program Files\CodeBlocks\Project's\shit>echo obj
obj
0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
04.05.2011, 19:44 #3
Вставляем в название темы "C++" и задаём любой вопрос, прикольно придумано...
0
Kastaneda
04.05.2011, 19:48
  #4

Не по теме:

kravam, да не, вопрос был - как это в С/С++ использовать.

0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
04.05.2011, 20:03 #5

Не по теме:

Так может дать ему исходник, выводящий директории на С++?



Добавлено через 12 минут
...А вообще если нужен будет список всех вложенных директорий, то вот:
C++
1
2
3
4
5
6
7
8
#include <windows.h>
#include <stdio.h>
 
int main () {
 
 system ("dir \"E:\\vso_moio\\Программирование системное\" /AD /S");
 getchar ();
}
1
IIIa66uMEM6eP
заставил Бендера
436 / 292 / 10
Регистрация: 05.12.2010
Сообщений: 1,648
Записей в блоге: 6
04.05.2011, 21:17  [ТС] #6
kravam, ну как бы интересуют бат команды в с++, как их в нем применять.

Цитата Сообщение от kravam Посмотреть сообщение
список всех вложенных директорий
да, не плохо.. пригодится) можно ли дальше как то с этим списком работать, например как только мы посмотрели все папки скопирывать в каждую нужный мне файл?
0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
04.05.2011, 23:02 #7
Нет, с этим не советую. А вот с этим можешь.
C++
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
//Код не мой, а некоего Юры, я его шлифанул
#include <windows.h>
#include <stdio.h>
 
long int rez= 0;
 
void GetFileList(LPTSTR sPath, LPTSTR sExt, LPTSTR sEXT);
 
int main(){
 
//Поскольку sPath и sExt и sEXT одинаковы во всех вызовах GetFileList, их можно было бы сделать
//глобальными, но я так оставил. 
//        char sPath[MAX_PATH]= "E:\\Microsoft_Visual_Studio_9.0";
//        char sPath[MAX_PATH]= "C:\\";
//        char sPath[MAX_PATH]= "E:\\vso_moio";
//        char sPath[MAX_PATH]= "E:\\vso_moio\\Программирование_на_C++\\";
        char sPath[MAX_PATH]= "E:\\vso_moio\\Программирование_на_C++\\3_third";
 
 
 
//Обратить  внимание на размер массива!
        char sExt[10]= "exe";
        char sEXT[10]= "EXE";
        GetFileList(sPath, sExt, sEXT);
      printf("rez= %d\n", rez);
 
//Портит всё дело: Если перенаправлять в файл с консоли, то полуачается, что в консол ведут 
//запись два разных потока- тот,который нужент и этот,который записывает "Для продлжения нажмите любую
//клавишу" и эта надпись вклинивается в серёдку и портит всё дело
  //system ("PAUSE");
}
 
void GetFileList(LPTSTR sPath, LPTSTR sExt, LPTSTR sEXT) {
 
 WIN32_FIND_DATA pFILEDATA;
 
 HANDLE hFile = FindFirstFile(strcat(sPath,"\\*.*"),&pFILEDATA);
 
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!Необходимо именно здесь прописывать длину пути!!!!!!!!!!!!!!!!!!!!!!!
 sPath[strlen(sPath) - strlen(strstr(sPath,"*.*"))] = '\0';
//Если пропишем после if (как предлагает Юра), то тогда, если вдруг натыкаемся на системную директорию
// или файл, то FindFirstFile возвращает -1. Следовательно, всё, что выплнняется по условию
//(hFile!=INVALID_HANDLE_VALUE) не выолнится и в частности, не будет поставлен конец строки!
//А это значит, что по выходу из  рекурсивной функции GetFileList в том месте, где мы восстанавливаем
//Длину, она будет восстановлена неправильно
 if (hFile!=INVALID_HANDLE_VALUE)    {
  char * chBuf;
  //sPath[strlen(sPath) - strlen(strstr(sPath,"*.*"))] = '\0';
  do {
   //Пропускаем . и ..
   if (strlen(pFILEDATA.cFileName) == 1 &&  strchr(pFILEDATA.cFileName,'.') !=NULL)
    if (FindNextFile(hFile,&pFILEDATA) == 0)
      break;
   if (strlen(pFILEDATA.cFileName) == 2 && strstr(pFILEDATA.cFileName,"..") !=NULL)
    if(FindNextFile(hFile,&pFILEDATA) == 0)
      break;
     //Если нашли директорию, запускаем поиск в ней рекурсивный поиск
   if(pFILEDATA.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
     GetFileList(strcat(sPath,pFILEDATA.cFileName), sExt, sEXT);
      CharToOem(sPath,sPath);
      printf("%s\n",sPath);
      OemToChar(sPath,sPath);
 
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!оБЯЗАТЕЛЬН востанавливать дллину пути................................     
     sPath[strlen(sPath) - strlen(pFILEDATA.cFileName)- 1] = '\0';
   }
   else {
    //Проверяем на соотвествие sExt расширения pFILEDATA.cFileName
 
 
 
//    if((chBuf = strrchr(pFILEDATA.cFileName,'.'))) {
//     if(strstr(chBuf + 1,sExt)|| strstr(chBuf + 1,sEXT)) {
//      //Если не будем использовать CharToOem() то на экране русский шрифт каракулями выйдет
//      CharToOem(sPath,sPath);
//      printf("%s\n",sPath);
//      OemToChar(sPath,sPath);
//      CharToOem(pFILEDATA.cFileName,pFILEDATA.cFileName);
//      printf("%s\n",pFILEDATA.cFileName);
//      rez++;
//     }
//    }
 
 
 
   }
  }
  while (FindNextFile(hFile,&pFILEDATA));
 }
}
Значит так, вот тебе код, на чистом С\C++, который рекурсивно выведет тебе все папки из указанной; Указывать папку надо в одной из этих строчек:
C++
1
2
3
4
5
//        char sPath[MAX_PATH]= "E:\\Microsoft_Visual_Studio_9.0";
//        char sPath[MAX_PATH]= "C:\\";
//        char sPath[MAX_PATH]= "E:\\vso_moio";
//        char sPath[MAX_PATH]= "E:\\vso_moio\\Программирование_на_C++\\";
        char sPath[MAX_PATH]= "E:\\vso_moio\\Программирование_на_C++\\3_third";
В коде много лишнего. Это потому, что изначально эта прога предназначалась для рекурсивного
нахождения всех экзешщников в указанной папке; я просто кое-что закомментиваю и всякий раз для новой цели её испольую. Надо будет -разберёшься.

Запускать советую из командной строки примерно так:
Bash
1
main.exe> rez.txt
И создастся у тебя текстовый файл с названиями всех подпапок.

Теперь:
Если после нахождения имени какой-нибудь папки тебе надо что-то с ней сделать, то в коде ишешь такое место:

C++
1
2
3
4
5
6
7
8
    GetFileList(strcat(sPath,pFILEDATA.cFileName), sExt, sEXT);
 
     //К этому моменту в sPath имя очередной директории
     //Вставляй сюда свой код, делай с ней чё хочешь
 
      CharToOem(sPath,sPath);
      printf("%s\n",sPath);
      OemToChar(sPath,sPath);
...Пожалуй, всё. Поэксперементируй со слэшами.

Добавлено через 9 минут
... На вот, лишнее вроде закомментил..
C++
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
//Код не мой, а некоего Юры, я его шлифанул
#include <windows.h>
#include <stdio.h>
 
long int rez= 0;
 
//void GetFileList(LPTSTR sPath, LPTSTR sExt, LPTSTR sEXT);
void GetFileList(LPTSTR sPath);
 
int main(){
 
//Поскольку sPath и sExt и sEXT одинаковы во всех вызовах GetFileList, их можно было бы сделать
//глобальными, но я так оставил. 
//        char sPath[MAX_PATH]= "E:\\Microsoft_Visual_Studio_9.0";
//        char sPath[MAX_PATH]= "C:\\";
//        char sPath[MAX_PATH]= "E:\\vso_moio";
//        char sPath[MAX_PATH]= "E:\\vso_moio\\Программирование_на_C++\\";
        char sPath[MAX_PATH]= "E:\\vso_moio\\Программирование_на_C++\\3_third";
 
 
 
//Обратить  внимание на размер массива!
//        char sExt[10]= "exe";
//        char sEXT[10]= "EXE";
//        GetFileList(sPath, sExt, sEXT);
        GetFileList(sPath);
      printf("rez= %d\n", rez);
 
//Портит всё дело: Если перенаправлять в файл с консоли, то полуачается, что в консол ведут 
//запись два разных потока- тот,который нужент и этот,который записывает "Для продлжения нажмите любую
//клавишу" и эта надпись вклинивается в серёдку и портит всё дело
  //system ("PAUSE");
}
 
//void GetFileList(LPTSTR sPath, LPTSTR sExt, LPTSTR sEXT) {
void GetFileList(LPTSTR sPath) {
 
 WIN32_FIND_DATA pFILEDATA;
 
 HANDLE hFile = FindFirstFile(strcat(sPath,"\\*.*"),&pFILEDATA);
 
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!Необходимо именно здесь прописывать длину пути!!!!!!!!!!!!!!!!!!!!!!!
 sPath[strlen(sPath) - strlen(strstr(sPath,"*.*"))] = '\0';
//Если пропишем после if (как предлагает Юра), то тогда, если вдруг натыкаемся на системную директорию
// или файл, то FindFirstFile возвращает -1. Следовательно, всё, что выплнняется по условию
//(hFile!=INVALID_HANDLE_VALUE) не выолнится и в частности, не будет поставлен конец строки!
//А это значит, что по выходу из  рекурсивной функции GetFileList в том месте, где мы восстанавливаем
//Длину, она будет восстановлена неправильно
 if (hFile!=INVALID_HANDLE_VALUE)    {
  char * chBuf;
  //sPath[strlen(sPath) - strlen(strstr(sPath,"*.*"))] = '\0';
  do {
   //Пропускаем . и ..
   if (strlen(pFILEDATA.cFileName) == 1 &&  strchr(pFILEDATA.cFileName,'.') !=NULL)
    if (FindNextFile(hFile,&pFILEDATA) == 0)
      break;
   if (strlen(pFILEDATA.cFileName) == 2 && strstr(pFILEDATA.cFileName,"..") !=NULL)
    if(FindNextFile(hFile,&pFILEDATA) == 0)
      break;
     //Если нашли директорию, запускаем поиск в ней рекурсивный поиск
   if(pFILEDATA.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
//     GetFileList(strcat(sPath,pFILEDATA.cFileName), sExt, sEXT);
     GetFileList(strcat(sPath,pFILEDATA.cFileName));
      CharToOem(sPath,sPath);
      printf("%s\n",sPath);
      OemToChar(sPath,sPath);
      rez++;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!оБЯЗАТЕЛЬН востанавливать дллину пути................................     
     sPath[strlen(sPath) - strlen(pFILEDATA.cFileName)- 1] = '\0';
   }
   else {
    //Проверяем на соотвествие sExt расширения pFILEDATA.cFileName
 
 
 
//    if((chBuf = strrchr(pFILEDATA.cFileName,'.'))) {
//     if(strstr(chBuf + 1,sExt)|| strstr(chBuf + 1,sEXT)) {
//      //Если не будем использовать CharToOem() то на экране русский шрифт каракулями выйдет
//      CharToOem(sPath,sPath);
//      printf("%s\n",sPath);
//      OemToChar(sPath,sPath);
//      CharToOem(pFILEDATA.cFileName,pFILEDATA.cFileName);
//      printf("%s\n",pFILEDATA.cFileName);
//      rez++;
//     }
//    }
 
 
 
   }
  }
  while (FindNextFile(hFile,&pFILEDATA));
 }
}
 
.
1
04.05.2011, 23:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.05.2011, 23:02
Привет! Вот еще темы с ответами:

C/C++ Использование функций, использование break - C++
Здравствуйте. Не знал как назвать тему, боялся что, если назову &quot;КАК ЭТО РАБОТАЕТ?&quot; то её удалят. Пишу программу для вычисления длинных...

Поиск команд ASM - C++
Здравствуйте. Я пытаюсь отловить с помощью своего модуля,функцию другого модуля. Составляю сигнатуру и хукаю. Не слишком сложные...

Отсортировать список команд - C++
Решите пожалуйста задачу, ПОЖАЛУЙСТА! Отсортировать список команд по суммам очков двух туров футбольного чемпионата. Исходные данные...

Генерация футбольных команд - C++
Доброго времени суток! Считываем команды из файла, например Зенит Спартак Анжи Барселона затем нужно сделать вывод пар...


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

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

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