Аргументы %P и %T и пути с пробелами

Обсуждение Total Commander. Установка, использование, настройка, решение проблем, скрытые функции. Обсуждение новых версий.

Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik

Ответить
x-code
Сообщения: 16
Зарегистрирован: Вт мар 20, 2012 09:22

Аргументы %P и %T и пути с пробелами

Сообщение x-code »

Добрый день!
Хочу добавить на панель инструментов некую кнопку с программой, которая принимает два аргумента - текущий путь одной панели и текущий путь другой панели. Вроде все просто, прописываю ей в аргументы %P %T
И это работает пока в путях не встречаются пробелы.
Как только пробелы встречаются - всё ломается. Коммандер по какой-то причине не оборачивает такие пути кавычками.
Попытка выставить кавычки вручную (написать "%P" "%T") также приводит к странным результатам. Открывающая кавычка просто выбрасывается, закрывающая остается. Для исследования этого вопроса я написал простейшую программу

Код: Выделить всё

int main(int argc, char **argv)
{
	for (int i = 0; i < argc; i++) 
		printf("%d: %s\n", i, argv[i]);
	getchar();
}
если подать ей закавыченные аргументы вручную, например
test.exe "c:/my docs" "c:/test/my docs"
то механизмы формирования аргументов совершенно корректно разбивают строку на аргументы, убирают кавычки и выводится ровно то что и ожидается.
0: d:\src\testcmdline\testcmdline.exe
1: c:\my docs
2: c:\test\my docs
Однако если создать указанные директории на диске, войти в них коммандером и запустить программу через коммандер с аргументами %P %T, выдается нечто странное:
0: d:\src\testcmdline\testcmdline.exe
1: C:\my docs" C:\test\my
2: docs"
добавление кавычек в различных сочетаниях не помогает и приводит к другим странным результатам.
Что делать?
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

x-code
Чтобы узнать, какую точно строку параметров передаёт программе TC, воспользуйтесь знаком вопроса в начале строки параметров кнопки.
?        В качестве первого символа параметров вызывает перед стартом программы диалоговое окно, содержащее указанные далее параметры. Вы можете изменить их перед стартом программы и даже отменить запуск.
x-code
Сообщения: 16
Зарегистрирован: Вт мар 20, 2012 09:22

Сообщение x-code »

sa
Спасибо! Тотал коммандер реабилитирован, но не совсем:)
Оказалось что он все-же оборачивает строки в кавычки, НО пути формируемые аргументами %P и %T заканчиваются обратным слэшем. А тот код который разбивает буфер с аргументами командной строки на отдельные строки, т.е. формирует argc и argv (функция WinAPI CommandLineToArgvW) интерпретирует обратный слэш перед кавычкой как escape-последовательность и не удаляет кавычку.
Это является вполе задокументированным поведением
https://learn.microsoft.com/ru-ru/windo ... inetoargvw
Так что по идее нужно добиться Коммандера, чтобы он не ставил завершающий обратный слэш в конце путей. Ну или пусть использует все прямые слэши, для 99% программ это то же самое.
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

x-code писал(а):чтобы он не ставил завершающий обратный слэш в конце путей
Note: All parameters now support substring fields in the form :~start,length, e.g. %N:~2,5 or %N:~-8,5 . To append a number directly after the length value, use another ~ character, e.g. %N:~2,5~2. Negative vaules are measured from the end of the string. Example: %P:~0,-1 cuts off the backslash from the path.
The Start value -0 is special: %N:~-0,20 copies the first 20 characters of the name without extension, %N:~-0,-20 the first 20 characters of the extension without the name.
Или здесь:
Все параметры наподобие %N, %P и пр. поддерживают извлечение подстроки в формате :~начало,длина. Начало отсчитывается с нуля, отрицательный номер задаёт отсчёт позиции подстроки с конца, а отрицательное число вместо длины — это позиция с конца для первого из удаляемых (не входящих в подстроку) символов. Например, %N:~2,5 означает 5 символов имени, начиная с третьего, а %N:~-8,5 — 5 символов, начиная от восьмого с конца, %N:~-8,-3 — отсчитанные с конца символы с восьмого по четвёртый включительно, а %P:~0,-1 — путь без завершающего обратного слэша \. Особую роль играет указание начальной позиции как -0. Например, %N:~-0,20 — это 20 первых символов имени без расширения, а %N:~-0,-20 — 20 первых символов расширения без имени. Если требуется дописать к результату извлечения подстроки число, оно отделяется дополнительным символом тильды, чтобы не сливалось со значением длины: например, %N:~2,5~2. Для вставки в этом месте самого символа тильды его нужно будет удвоить.
x-code
Сообщения: 16
Зарегистрирован: Вт мар 20, 2012 09:22

Сообщение x-code »

Посмотрел внимательнее, оказалось что Коммандер ставит кавычки для сочетаний %P%N и %T%N, только в случае если в пути имеются пробелы.
А просто для %P и %T не ставит никогда
Так что вариант %P:~0,-1 применим только для %P и %T
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

x-code писал(а):Коммандер ставит кавычки для сочетаний %P%N и %T%N, только в случае если в пути имеются пробелы
Используйте параметр %Q (описание из справки по предыдущей ссылке):
%Q     Отключает автоматическое добавление кавычек вокруг определённых параметров …таких как %P%N, при наличии пробелов в именах/путях. В этом случае пользователю следует добавлять кавычки самостоятельно.
Ответить