Как обойти предел длины командной строки?

Я работал над маленькой и простой программой, что я отбрасываю файлы на и, на основе правил certian, они перемещены в различные места.

Программа хорошо работает, если я не отбрасываю больше, чем несколько файлов, затем она отвечает ошибке ударом на удар (который, кажется, больше Windows, чем что-нибудь), что команда "c:\myapp.exe \file \file \file" запуска является слишком длинной.

Я понимаю, что мог настроить фоновый процесс, но я действительно предпочту, чтобы эта программа не работала в backround (где это было бы неактивно большую часть времени).

Существует ли путь вокруг этого ограничения?

17
задан Crash893 27 May 2010 в 18:26
поделиться

8 ответов

Если вы хотите отбрасывать файлы в соответствии с проводником Windows, вы можете реализовать свои собственные обработчики перетаскивания в качестве обработчиков расширений оболочки, см .:

На Полное руководство идиота по написанию расширений оболочки вы найдете хорошее введение, как писать такие расширения.

Часть VI дает пример Drop Handler (для небольшого другого варианта использования, но это не имеет значения).

Что касается Drop Shell Extension Handler, ваша программа будет получать полную информацию обо всех удаленных файлах, и вам не нужно запускать дочернюю программу со всеми файлами как с параметрами, подобными командам.

14
ответ дан 30 November 2019 в 11:51
поделиться

Когда файлы перетаскиваются в приложение, запишите список имен файлов в текстовый файл, а затем укажите местоположение этого файла вашей программе. Целевая программа может затем прочитать этот файл и обработать его построчного. Таким образом, вы передаете только одно имя файла.

1
ответ дан 30 November 2019 в 11:51
поделиться

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

ОБНОВЛЕНИЕ:

Если требуется возможность перетаскивать элемент в .exe через проводник Windows для запуска приложения, как упомянул Марк, тогда вы можете поместить все свои файлы в одну папку и перетащить всю папку на файл .exe.

1
ответ дан 30 November 2019 в 11:51
поделиться

Я думаю, что самое простое решение - изменить ваше приложение, чтобы оно принимало каталог в качестве параметра, а не список файлов. Это позволит вам скопировать несколько файлов в один каталог. Затем вы можете перетащить папку на свой исполняемый файл. Затем он запустит команду типа «c: \ myapp.exe \ folder-with-files-in-it», которая не должна соответствовать ограничению параметра командной строки, которое вы испытываете сейчас.

1
ответ дан 30 November 2019 в 11:51
поделиться

Из этого блога :

  • Максимальная длина командной строки для функции CreateProcess составляет 32767 символов. Это ограничение исходит из структуры UNICODE_STRING.
  • Если вы используете командный процессор CMD.EXE, то на вас также распространяется ограничение на длину командной строки в 8192 символа, установленное CMD.EXE.
  • Если вы используете функцию ShellExecute / Ex, тогда вы попадаете под действие ограничения длины командной строки INTERNET_MAX_URL_LENGTH (около 2048), налагаемого функциями ShellExecute / Ex.
  • Максимальный размер вашей среды - 32767 символов. Размер среды включает все имена переменных плюс все значения.

Так что вам придется решить некоторые из упомянутых обходных путей (кроме того, есть еще один обходной путь в блоге msdn, на который я ссылался).

14
ответ дан 30 November 2019 в 11:51
поделиться

Я столкнулся с подобной проблемой, когда пытался получить данные безопасности по длинному пути. Мое решение заключалось в создании карты дисков всякий раз, когда длина пути становилась слишком большой. Посмотрите мое решение на странице Как получить сведения о безопасности для длинного пути?

1
ответ дан 30 November 2019 в 11:51
поделиться

Команды Unix часто имеют один или два параметра неограниченной длины. Некоторые из этих команд имеют добавленные параметры, которые могут получать эти аргументы из файла или из стандартного ввода. Итак, у вас есть одна команда, которая формирует список аргументов и либо направляет их во временный файл, либо передает их на стандартный вывод.

См. Также xargs, который может принимать список аргументов и вызывать вашу команду со всеми параметрами или группами.

1
ответ дан 30 November 2019 в 11:51
поделиться

Я думаю, что обработчик перетаскивания, возможно, является одним из вариантов, но он кажется довольно тяжелым.

Альтернативным решением является использование обработчика контекстного меню Explorer. С его помощью вы выделите все файлы, но вместо того, чтобы перетаскивать их, щелкните правой кнопкой мыши и выберите новый пункт меню "Отправить в ".

Когда пункт меню выбран, он передает список команд вашей программе. Есть несколько способов сделать это:

  1. запустить свою программу и передать список файлов на стандартный ввод
  2. записать список файлов во временный файл и запустить свою программу только с одним аргументом команды - временным файлом со списком файлов для обработки. Файлы списка обычно снабжаются префиксом '@' в командной строке, чтобы отличить их от обычных имен файлов.
2
ответ дан 30 November 2019 в 11:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: