Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.91/70: Рейтинг темы: голосов - 70, средняя оценка - 4.91
Vlad_IT
1440 / 348 / 60
Регистрация: 03.04.2010
Сообщений: 2,095
#1

Запуск Bat файлов

25.09.2010, 01:13. Просмотров 12850. Ответов 29
Метки нет (Все метки)

Возможно ли как-нибудь запустить bat файлы программно. Пробовал с помощью Shell но не получил желаемого результата. Помогите пожалуйста.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.09.2010, 01:13
Ответы с готовыми решениями:

Как организовать сохранение bat файл и его запуск
Создаю программу которая должна в зависимости от выбранных параметров записать...

Запуск bat файла или команды в CMD, не выходит
Нужно настроить маршрутизацию, пробовал создавать bat файл, а потом его...

Запуск и удаление исполняемых файлов из каталога
Здравствуйте. Помогите пожалуйста разобраться в некоторых местах кода. Полное...

запуск файлов своей программой(открыть через.)
Здравствуйте! Подскажите пожалуйста, как бы Мне сделать так, что бы, когда Я...

Сохранение различных файлов в теле програмы (в создаваемой нами) и извлечение их(файлов) на локальный диск
Кароч тута такие дела: есть куча разных файликов которые пользователь проги...

29
MikeSoft
Эксперт С++
3918 / 1783 / 183
Регистрация: 21.11.2009
Сообщений: 2,540
25.09.2010, 02:06 #2
doocee, с помощью ShellExecute всё отлично получится:
C++
1
ShellExecute(Handle,"open","D:\\Clear.bat",NULL,NULL,SW_SHOW);
То же самое можно с помощью WinExec сделать:
C++
1
WinExec("D:\\Clear.bat",SW_SHOW);
Подобное на форуме описывалось не один раз (лично мной только раз пять), можно было и поиск открыть...
0
Vlad_IT
1440 / 348 / 60
Регистрация: 03.04.2010
Сообщений: 2,095
25.09.2010, 02:20  [ТС] #3
MikeSoft, Не ну я понимаю. Но я не про exe я именно про bat, а его просто так запустить нельзя. Может я ошибаюсь!
0
MikeSoft
Эксперт С++
3918 / 1783 / 183
Регистрация: 21.11.2009
Сообщений: 2,540
25.09.2010, 02:35 #4
Цитата Сообщение от doocee Посмотреть сообщение
Но я не про exe я именно про bat
А я о чём выше пример приводил?
0
Vlad_IT
1440 / 348 / 60
Регистрация: 03.04.2010
Сообщений: 2,095
25.09.2010, 02:37  [ТС] #5
Я не спорю он запускается. Но не так.
0
mazaxaka
3 / 3 / 1
Регистрация: 28.08.2010
Сообщений: 29
25.09.2010, 02:39 #6
Цитата Сообщение от doocee Посмотреть сообщение
Я не спорю он запускается. Но не так.
а как нужно тогда объясни поподробней
1
MikeSoft
Эксперт С++
3918 / 1783 / 183
Регистрация: 21.11.2009
Сообщений: 2,540
25.09.2010, 02:45 #7
Цитата Сообщение от doocee Посмотреть сообщение
Я не спорю он запускается. Но не так.
Интересно, что значит "не так" ?

Не по теме:

Вспомнился анекдот:
- Доктор, у меня что-то болит!
- Вот вам какая-то таблетка!






То, что выше - запуск батника. Запускается он из указанной директории, но работает в текущей.
Если вам это не нравится - пробуйте изменить текущую директорию или указывать абсолютные пути в bat-файле.

Если же вам просто нужно исполнять команды, то воспользуйтесь функцией system:
C++
1
system("dir D:\\ /b && pause");
1
Vlad_IT
1440 / 348 / 60
Регистрация: 03.04.2010
Сообщений: 2,095
25.09.2010, 02:52  [ТС] #8
Ладно. Я создаю что-то типа компилятора C#,C++,java. Так вот функция этого компилятора будет просто создать файл *.cs и build.bat и прописать пару строчек в bat и запустить bat а потом exe. Я создал код все вроде хорошо и сохраняется. Нажал запустить Bat появилась командная строка, а потом exe и не какой генерации кода нет, а если запущу в проводнике то все ок.
0
Alex_La
17 / 17 / 3
Регистрация: 28.06.2010
Сообщений: 77
25.09.2010, 04:49 #9
как выше было сказано надо прописывать пути жестко, у меня например тоже был случай запускался bat файл искался не в D:\\test а C:\\Documents and Settings\\...
исправилось все указанием пути и папки где все файлы для запуска.
1
Vlad_IT
1440 / 348 / 60
Регистрация: 03.04.2010
Сообщений: 2,095
25.09.2010, 17:11  [ТС] #10
Все я все понял. Просто я совершил глубочайшею ошибку. Я писал так
C++
1
ShellExecute(Handle,NULL,"build.bat",NULL,NULL,SW_SHOW);
А надо вот так...
C++
1
ShellExecute(Handle,"open","build.bat",NULL,NULL,SW_SHOW);
Приношу свои извинения за то что я всем мозги потрепал. Всем спасибо.
0
iama
1326 / 979 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
26.09.2010, 00:22 #11
doocee, работать будет и первый вариант
0
Vlad_IT
1440 / 348 / 60
Регистрация: 03.04.2010
Сообщений: 2,095
26.09.2010, 11:10  [ТС] #12
iama, В моем случае почему то нет.
0
Tarik20
21 / 22 / 5
Регистрация: 14.02.2013
Сообщений: 243
07.05.2013, 21:11 #13
Цитата Сообщение от Vlad_IT Посмотреть сообщение
Возможно ли как-нибудь запустить bat файлы программно. Пробовал с помощью Shell но не получил желаемого результата. Помогите пожалуйста.
C++
1
ShellExecute(Handle,"cmd","D:\\Clear.bat",NULL,NULL,SW_SHOW);
0
blackenergy
4 / 4 / 2
Регистрация: 26.03.2013
Сообщений: 108
07.05.2013, 22:46 #14
ссори что влезаю, а подскажите как создать бат файл програмно на с++
0
Stridemann
4 / 4 / 3
Регистрация: 19.01.2013
Сообщений: 56
08.05.2013, 22:44 #15
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от blackenergy Посмотреть сообщение
меня интересует как создать программно
Как-то так..


C++
1
2
3
4
5
TStringList *List = new TStringList();  //создает сущность для текста
List->Strings[0]="что будет в первой строке";
List->Strings[1]="что будет во второй строке";  //скорее всего это не нужно. Но обычно можно команду Pause вписать
List->SaveToFile("C:\\1.bat");
delete List;
3
lanu4
15 / 15 / 5
Регистрация: 21.08.2012
Сообщений: 115
Записей в блоге: 2
24.12.2013, 05:44 #16
Чтоб не плодить тем, тоже самое про Bat файл, приложение консольное, возможно ли проследить окончание выполнения bat файла? Например с помощью SHELLEXECUTEINFO ? у меня ошибка вызывается:
First chance exception at $65239431. Exception class $C0000005 with message 'access violation at 0x65239431: read of address 0x01b80000'. Process Global_settings.exe (3772)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SHELLEXECUTEINFO si1;
    memset(&si1, 0, sizeof(si1));
    si1.cbSize = sizeof(si1);
    si1.hwnd = Application->Handle;
    if (OS.Pos("XP") || OS.Pos("2000") || OS.Pos("2003"))
        si1.lpVerb = "open";
    else
        si1.lpVerb = "runas";
    si1.lpFile = "\\\\IP_adress\\Shara\\SetupWinUpdates.bat"; //IP_adress - адрес в сети
    si1.nShow = SW_HIDE;
    si1.fMask = SEE_MASK_NOCLOSEPROCESS;
    Application->ProcessMessages();
    bool res1 = ShellExecuteEx(&si1); //на этой строчке
    if (res1) {
        WaitForSingleObject(si1.hProcess, INFINITE);
            printf("4) Ok.");
        }
        else 
                printf("4) Fail.");
А если обычно скомпилированный с папки запускаю, ошибки нет и выдает "4) Ok." я что то накосячил?
0
Stridemann
4 / 4 / 3
Регистрация: 19.01.2013
Сообщений: 56
24.12.2013, 05:52 #17
Не совсем понятно что нужно. Если вывести результат (текст) работы консольки в edit (RichEdit) то как-то так:

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
HANDLE SpawnAndRedirect(LPCTSTR commandLine, HANDLE *hStdOutputReadPipe, LPCTSTR lpCurrentDirectory)
{
  HANDLE hStdOutputWritePipe, hStdOutput, hStdError;
  CreatePipe(hStdOutputReadPipe, &hStdOutputWritePipe, NULL, 0);
  DuplicateHandle(GetCurrentProcess(), hStdOutputWritePipe,GetCurrentProcess(), &hStdOutput,0, TRUE, DUPLICATE_SAME_ACCESS);
  DuplicateHandle(GetCurrentProcess(), hStdOutput, GetCurrentProcess(), &hStdError, 0, TRUE, DUPLICATE_SAME_ACCESS);
  CloseHandle(hStdOutputWritePipe);
  PROCESS_INFORMATION pi;
  STARTUPINFO si;
  ZeroMemory(&si, sizeof(STARTUPINFO));
  si.cb = sizeof(STARTUPINFO);
  si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
  si.hStdInput  = GetStdHandle(STD_INPUT_HANDLE);
  si.hStdOutput = hStdOutput;
  si.hStdError  = hStdError;
  si.wShowWindow = SW_HIDE;
  TCHAR commandLineCopy[1024];
  strcpy(commandLineCopy, commandLine);
  if(!CreateProcess(NULL, commandLineCopy, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, lpCurrentDirectory, &si, &pi))
    {
      CloseHandle(hStdOutput);
      CloseHandle(hStdError);
      CloseHandle(*hStdOutputReadPipe);
      *hStdOutputReadPipe = INVALID_HANDLE_VALUE;
      return NULL;
    }
  CloseHandle(pi.hThread);
  CloseHandle(hStdOutput);
  CloseHandle(hStdError);
  return pi.hProcess;
}
//---------------------------------------------------------------------------
AnsiString GetInfo(LPCTSTR commandLine)
{
  HANDLE hOutput, hProcess;
  hProcess = SpawnAndRedirect(commandLine, &hOutput, NULL);
  if(!hProcess)
    {
      return "";
    }
  CHAR buffer[128];
  CHAR out[131072] = "";
  DWORD read;
  while(ReadFile(hOutput, buffer, 128, &read, NULL))
    {
      buffer[read] = '\0';
      lstrcatA(out, buffer);
    }
  CHAR msg[131072] = "";
  OemToCharA(out, msg);
  AnsiString str = AnsiString(msg);
  CloseHandle(hOutput);
  CloseHandle(hProcess);
  return str;
}
//////////////////////////////////////////////////////////////////////
Запуск сего чуда:

C++
1
2
3
AnsiString Command = "тут командная строка запуска";
AnsiString Result = GetInfo(Command.c_str());
RichEdit1->Text=Result;
С инклюдов не помню какие из этого списка нужно, скидываю все..

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#define NO_WIN32_LEAN_AND_MEAN
#include <shlobj.h>
#include <windows.h>
#include <system.hpp>
#include <sysUtils.hpp>
#include <Math.hpp>
#include <math.h>
 
 
#include <vcl.h>
#include <set>
#pragma hdrstop
#include <FileCtrl.hpp>
Говорят чтоб программа не зависала при ожидании результата то нужно делать как-то потоками. Далеко не лез в лес, еще не дошел до этого.
0
Merser5
6 / 6 / 3
Регистрация: 10.12.2013
Сообщений: 116
19.11.2014, 18:35 #18
Здравствуйте у меня не запускает БАТ файл, пишет путь не найден, или команда не та, что это может быть.
0
Tarik20
21 / 22 / 5
Регистрация: 14.02.2013
Сообщений: 243
19.11.2014, 18:43 #19
Код в студию!
0
Merser5
6 / 6 / 3
Регистрация: 10.12.2013
Сообщений: 116
19.11.2014, 18:47 #20
Разные способы.
C++
1
2
3
4
5
6
7
void load()
{
    //WinExec("C:\\Users\\Admin\\Documents\\Visual Studio 2010\\Projects\\anketa\\skript\\dir.bat",SW_SHOW);
    //ShellExecute(Handle,"open","D:\\Clear.bat",NULL,NULL,SW_SHOW);
    system("dir C:\\Users\\Admin\\Documents\\Visual Studio 2010\\Projects\\anketa\\skript\\dir.bat /b && pause");
    
}
0
19.11.2014, 18:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2014, 18:47

Завершить .bat
Уважаемые форумчане подскажите как завершить работу батников, у них же нету...

Bat от имени администратора
Есть Bat файл который изменяет данные в реестре, на W7 требуются права админа...

Работа с bat-файлом
Подскажите, вот создаю батник: FileCreate(&quot;C:\\dd.bat&quot;); Как открыть этот...


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

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

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