Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2018, 10:47   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию открыть консоль windows и выполнить в ней команду. Пробелы в пути к ЕХЕ

Здравствуйте.
Очередной тупой вопрос из серии "почему это не работает?" и "чё вообще происходит?"
Нужно открыть окно консоли windows и в нем выполнить команду.
Код:
//код GunSmoker'a:
procedure ShellExecute(const AWnd: HWND; const AOperation, AFileName: String;
                       const AParameters: String = ''; const ADirectory: String = '';
                       const AShowCmd: Integer = SW_SHOWNORMAL);
var
  ExecInfo: TShellExecuteInfo;
  NeedUnitialize: Boolean;
begin
  Assert(AFileName <> '');

  NeedUnitialize := Succeeded(CoInitializeEx(nil, COINIT_APARTMENTTHREADED or COINIT_DISABLE_OLE1DDE));
  try
    FillChar(ExecInfo, SizeOf(ExecInfo), 0);
    ExecInfo.cbSize := SizeOf(ExecInfo);

    ExecInfo.Wnd := AWnd;
    ExecInfo.lpVerb := Pointer(AOperation);
    ExecInfo.lpFile := PChar(AFileName);
    ExecInfo.lpParameters := Pointer(AParameters);
    ExecInfo.lpDirectory := Pointer(ADirectory);
    ExecInfo.nShow := AShowCmd;
    ExecInfo.fMask := SEE_MASK_NOASYNC { = SEE_MASK_FLAG_DDEWAIT для старых версий Delphi }
                   or SEE_MASK_FLAG_NO_UI;
    {$IFDEF UNICODE}
    // Необязательно, см. http://www.transl-gunsmoker.ru/2015/...tually-do.html
    ExecInfo.fMask := ExecInfo.fMask or SEE_MASK_UNICODE;
    {$ENDIF}

    {$WARN SYMBOL_PLATFORM OFF}
    Win32Check(ShellExecuteEx(@ExecInfo));
    {$WARN SYMBOL_PLATFORM ON}
  finally
    if NeedUnitialize then
      CoUninitialize;
  end;
end;
Юзаем:
Код:
  ShellExecute(Handle,'', 'cmd.exe', '/k "' + Edit2.Text + '"');
//edit2 содержит текст "H:\Other programs\FFMpeg\ffmpeg.exe" без кавычек
end;
Работает. Юзаем дальше:
Код:
  ShellExecute(Handle,'', 'cmd.exe', '/k "'+ Edit2.Text + '" -i "any text"');
//edit2 содержит текст "H:\Other programs\FFMpeg\ffmpeg.exe" без кавычек
end;
Не работает! В окне консоли выдаётся сообщение: ""H:\Other" не является внутренней или внешней командой, исполняемой программой или пакетным файлом."
Почему? Ведь путь к ЕХЕ взят в кавычки. Как это исправить?

Последний раз редактировалось BLACK_RAIN; 29.04.2018 в 11:00.
BLACK_RAIN вне форума Ответить с цитированием
Старый 29.04.2018, 12:37   #2
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Можно через GetShortPathName путь сокращать. Тогда работает и без кавычек.
Но почему вариант с кавычками не работает? Ведь если вручную набрать в консоли ту же самую команду (или вставить ее) - работает. А если вызвать программно - тогда не работает.
В чем разница?
BLACK_RAIN вне форума Ответить с цитированием
Старый 29.04.2018, 20:02   #3
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

PChar(твоя строка c кавычками) не поможет?
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 30.04.2018, 01:16   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
ShellExecute(Handle,'', 'cmd.exe', '/k "'+ Edit2.Text + '" -i "any text"');
А если так
Код:
ShellExecute(Handle,'', 'cmd.exe', '/k "'+ Edit2.Text + ' -i "any text"');
northener вне форума Ответить с цитированием
Старый 30.04.2018, 02:32   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 30.04.2018, 12:51   #6
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
А если так
Происходит ровно то же самое. Хотя, по-идее, должна быть ошибка синтаксиса.
Я еще вот что выяснил. Если после "path\ffmpeg.exe" не ставить еще кавычки, тогда работает. Но не ставить их нельзя, так как в именах файлов и папок скорее всего будут пробелы.

Min@y
А чего в этой структуре может быть не так? Ну посмотрел. Там всё правильно:
lpVerb = nil
lpFile = 'cmd.exe'
lpParameters = '/k "H:\Other programs\FFMpeg\ffmpeg.exe" -i "any text"'
lpDirectory = nil
BLACK_RAIN вне форума Ответить с цитированием
Старый 30.04.2018, 13:03   #7
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
А чего в этой структуре может быть не так? Ну посмотрел. Там всё правильно:
lpVerb = nil
lpFile = 'cmd.exe'
lpParameters = '/k "H:\Other programs\FFMpeg\ffmpeg.exe" -i "any text"'
lpDirectory = nil
Ну я хз. Напиши тестовый проект и выложи, попробую смоделировать у себя.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 30.04.2018, 13:27   #8
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
. Напиши тестовый проект и выложи, попробую смоделировать у себя
https://yadi.sk/d/W_YLfkLd3UyEpr
Кнопка "скачать" юзает "GetShortPathName", по-этому работает.
кнопка "TEST" юзает кавычки, по-этому не работает.
BLACK_RAIN вне форума Ответить с цитированием
Старый 30.04.2018, 14:45   #9
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Поковырялся. Не то, чтобы совсем успешно, но промежуточные результаты таки есть.

Чтоб не засирать свой ютуб-канал, видео на рутуб залил.

Ниже - изменённый проектЪ.
Вложения
Тип файла: 7z hls link downloader.7z (59.9 Кб, 11 просмотров)
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 01.05.2018, 11:18   #10
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Min@y
После просмотра видосика столько эмоций нахлынуло Первый раз в жизни школотой обозвали Как только не обзывали, но чтобы ШКОЛОТОЙ
Сначала страшновато было смотреть обзор на себя, но к середине видео я уже не мог сдержать улыбку. Особенно когда вы разбирались, зачем я запускаю cmd.exe и для чего нужен параметр /k.
Я , конечно же, есстно, ожидал кучу мата и негатива в свой адрес. Но хотел услышать более обоснованную аргументацию. А так это всё, как говорится, притянуто за уши (а в некоторых местах и за нечто иное).
Хороший обзорчик получился. Мне реально понравилось. Напомнило как Ваномас играет в очередную игру, которая по сути не такая уж и плохая, но просто ему не нравится.
Однако, хочу прокомментировать некоторые моменты:
1) Почему я прислал весь проект, а не тестовый?
Потому что это и так почти тестовый проект. Уменьшать его просто нет смысла. Он и так почти минималистичен. Я специально сделал кнопку "TEST", в коде которой написал одну строчку, в которой заключается вся проблема. А вы эту кнопку просто проигнорировали и начали допиливать всю программу и разбираться с ffmpeg. Хотя ffmpeg тут вообще не при чем. Хотели тестовый проект, а кнопку с надписью "TEST" отодвинули в сторону.
2) вы несколько раз упрекнули меня в том, что я где-то "стыбзил" код и что функция ShellExecute давно устарела.
Ну ок. Давайте разберемся. Во-первых: "стыбзил" не "где-то", а у GunSmoker'а. GunSmoker фигни не напишет. Во-вторых: эта обёртка является переходником на более новую функцию ShellExecuteEx. В-третьих: суть вопроса это не меняет. Хоть через CreateProcess запускай - результат один. Ничего не работает из-за вторых кавычек. Кстати, я об этом уже написал в одном из предыдущих постов. Видно, зря написал. Вы это даже не читали.
3) Откуда-то берутся символы #13#10
лол, что? Вы серьёзно? На этом моменте я себе лицо рукой пробил. И с этого момента понял, где смеяться.
Вы же код кнопки своими глазами видели. Видели, что там нет проверок на ошибки. Тогда, скажите, зачем вы вставили ссылку с переносом строки в конце? Мне просто логику понять хочется. Естевственно, это работать не будет.
Просили тестовый проект - получили тестовый проект. Сами накосячили, а меня еще и оскорбили. Типичный школьник: "Я уже взрослый. Я могу пить пиво на праздники".
Типичный программист: "Я программист. Я могу материть нуба вне зависимости от причины возникновения ошибки".
4) не переименовал компоненты, колхозник
Согласен, мой косяк. Но чего там переименовывать? Одно Memo, два edit'а и кнопка "TEST". И две строчки кода. Я не знаю, как в этом можно запутаться.
В своём предпоследнем посте я чётко написал: кнопка "скачать" работает. Кнопка "TEST" не работает. А вы полезли чинить РАБОЧУЮ кнопку. Зачем?
5) Для чего нужно "cmd.exe /k"?
Это нужно для того, чтобы окно консоли не закрывалось после выполнения команды. Не знать таких простых вещей, да еще при этом материться как бухой сапожник на человека, который всё правильно сделал - это, извините, Ваномас.
6) Для чего вообще нужна программа и есть ли аналоги?
Программа нужна для того, чтобы скачивать стримы с твича, GoodGame'а (и им подобным) в прямом эфире, а не капчерить их через BandiCam.
Такие программы, конечно же, существуют. Но все они работают плохо. Они либо не принимают ссылку, либо виснут при скачивании, либо не дают ввести имя output-файла. Либо, что еще хуже, просят вводить имя файла каждый раз. В результате чего, мы теряем драгоценные секунды стрима.
Для этого я и написал свой говнокод. Чтобы можно было просто вставить ссылку и нажать одну большую кнопку и все нужные параметры подставятся автоматически. БОЛЬШУЮ кнопку именно для того, чтобы второпях по ней было сложнее промахнуться. А не потому что я школьник и написал свою мега-крутую программу для скачивания. Чувствуете разницу?
----
И еще было много моментов, которые можно смешно прокомментировать. Но это не сейчас и не здесь.
Итак, в результате мы имеем: крутой программист, до того крутой, что может материть нуба как хочет, за 40 минут не смог запустить консоль windows так чтобы она не закрылась
Я признаю, что я изначально поставил вопрос немного неправильно (как обычно). Я не написал, что окно консоли не должно закрываться после выполнения команды.
Но у меня в коде написано cmd.exe /k. Это не просто так написано. Это априори без пояснения означает, что консоль не должна закрываться. Это должен знать каждый (тем более программист). Я не программист, но даже я это знаю! Это как знать, что функция ShellExecute давно устарела и юзать ее нельзя. А если кто-то этого не знает, то руки таким надо отрывать!
Цитата:
Сообщение от min@y™ Посмотреть сообщение
Не то, чтобы совсем успешно, но промежуточные результаты таки есть.
Это полное фиаско, а не результаты

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Чтоб не засирать свой ютуб-канал, видео на рутуб залил.
Это видео войдёт в золотые анналы рутуба
BLACK_RAIN вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти в диапазоне ячейку с текстом и выполнить над ней действие ольгаг Microsoft Office Excel 3 03.06.2016 07:24
Ввести строку, заменить в ней двойные символы на одиночные, пробелы-на знак подчеркивания, сочетания '**' на многоточие [ Delphi ] Rimone Помощь студентам 3 29.06.2012 13:06
Как выполнить команду из консоли Arassir PHP 1 17.02.2012 15:13
Пробелы в пути к файлу royun Общие вопросы Delphi 5 28.10.2011 05:02
не могу открыть и отредактировать ехе!!! qpanunahqp Помощь студентам 4 02.11.2010 17:56