В my answer to this question, где запрашивающему нужен быстрый способ получить список каталогов на сетевом диске, я предложил использовать команду DOS «dir». К сожалению, это команда, а не программа, поэтому вы не можете выполнить ее с помощью CreateProcess, поэтому мне пришлось поместить ее в пакетный файл. Мне не нравится это решение. Мне кажется, что это взломать. Кто-нибудь знает способ запускать dir из Delphi, а не из внешнего командного файла?Есть ли способ запустить «dir» напрямую?
ответ
Вам не нужен пакетный файл, вы можете просто выполнить:
cmd.exe /c dir
Вы можете проверить возможность командовать с cmd /?
:
c:> cmd /?
CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF]
[[/S] [/C | /K] string]
/C Carries out the command specified by string and then terminates
: : : : :
Есть ли способ сделать это невидимо? Вызов cmd.exe откроет окно DOS в середине вашего приложения. –
@ Мейсон: См. Ответ Мефа. Хитрость заключается в том, чтобы установить wShowWIndow в SW_HIDE и включить STARTF_USESHOWWINDOW в dwFlags. – gabr
Невидимого решение (создать канал, выполните команда, перенаправить stdout на трубу, зачитать трубу):
function Console(const Command: String): String;
var
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
SecurityAttr: TSecurityAttributes;
OutputPipeRead, OutputPipeWrite: THandle;
Res: Boolean;
BufSize: Cardinal;
Buffer: String;
BytesRead: Cardinal;
begin
FillChar(ProcessInfo, SizeOf(TProcessInformation), 0);
FillChar(SecurityAttr, SizeOf(TSecurityAttributes), 0);
SecurityAttr.nLength := SizeOf(SecurityAttr);
SecurityAttr.bInheritHandle := true;
SecurityAttr.lpSecurityDescriptor := nil;
CreatePipe(OutputPipeRead, OutputPipeWrite, @SecurityAttr, 0);
FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
StartupInfo.cb:=SizeOf(StartupInfo);
StartupInfo.hStdInput := 0;
StartupInfo.hStdOutput := OutputPipeWrite;
StartupInfo.hStdError := OutputPipeWrite;
StartupInfo.wShowWindow := SW_HIDE;
StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
Res := CreateProcess(nil, PChar(command), nil, nil, true,
CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or
NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo);
CloseHandle(OutputPipeWrite);
Result := '';
if Res then
begin
SetLength(Buffer, 5000);
BufSize := Length(Buffer);
repeat
Res := ReadFile(OutputPipeRead, Buffer[1], BufSize, BytesRead, nil);
Result := Result + Copy(Buffer, 1, BytesRead);
until not Res;
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
CloseHandle(ProcessInfo.hProcess);
end;
CloseHandle(OutputPipeRead);
end;
Образец использования :
ShowMessage(Console('cmd /c dir C:\'));
Использование DSiWin32:
sl := TStringList.Create;
if DSiExecuteAndCapture('cmd.exe /c dir', sl, 'c:\test', exitCode) = 0 then
// exec error
else
// use sl
sl.Free;
Почему не FindFirstFile
? Он возвращает атрибут для каждого элемента, который можно сравнить с FILE_ATTRIBUTE_DIRECTORY
, чтобы проверить каталог. Я очень подозреваю, что dir
ничего не делает. Использование команды dir
похоже на использование строки на клавиатуре.
Следуя за другим потоком, я думаю, что OP больше интересовался вызовом интерпретатора командной оболочки, а не «dir». –
- 1. Есть ли способ напрямую запустить tomcat с аргументом файла войны
- 2. Есть ли способ изменить SONAME бинарного напрямую?
- 3. Есть ли простой способ эмуляции Dir :: glob?
- 4. Есть ли способ изменить файл .adt напрямую?
- 5. Есть ли способ оценить (expand-file-name) в .dir-locals.el?
- 6. Есть ли способ сделать MVC.NET-маршрутизацию игнорировать несколько/dir/paths /?
- 7. Есть ли способ запустить Plato на coffeescript
- 8. Есть ли способ запустить сервер capybara?
- 9. Есть ли способ запустить PHP на Android
- 10. Есть ли способ запустить MJML в PHP?
- 11. Есть ли способ запустить представление внутри частичного
- 12. Есть ли способ запустить svg на клик?
- 13. Есть ли способ запустить Dart's Future синхронно?
- 14. Есть ли способ запустить XQuery в Chrome?
- 15. Есть ли способ запустить RPM-установку параллельно?
- 16. Есть ли способ запустить Java в R?
- 17. Есть ли способ запустить LibreSSL в Windows?
- 18. Есть ли способ безопасно запустить SELECT INTO?
- 19. Есть ли способ запустить R в Excel?
- 20. Есть ли способ запустить OpenBravo на AppEngine?
- 21. Есть ли способ запустить Virtualbox внутри AWS?
- 22. Есть ли способ запустить MQ на облаке?
- 23. Есть ли способ запустить файл jar скрытый?
- 24. XNA: Есть ли способ нарисовать плитки из плитки напрямую?
- 25. Есть ли способ сохранить индексный диапазон списка напрямую?
- 26. Есть ли способ напрямую редактировать файлы на сервере?
- 27. Есть ли способ напрямую подключиться к postgres из appengine?
- 28. Есть ли способ отправить уведомление TTN_NEEDTEXT дочернему элементу управления напрямую?
- 29. Есть ли способ установить msm напрямую без создания другой настройки?
- 30. Есть ли способ напрямую форматировать время в Javascript?
Как использовать командный файл как взломать? Это довольно очевидное решение. – defines
Да, вот почему я так быстро подумал об этом. Но «очевидное решение» не обязательно совпадает с «хорошим решением». –
Кажется, что вы хотите что-то вроде DOS API, который будет принимать команды и возвращать результаты для отображения в любом текстовом поле в вашем приложении или что-то в этом роде, не так ли? – Marcelo