Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

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

 
Post new topic   Reply to topic    Total Commander Forum Index -> Общие вопросы printer-friendly view
View previous topic :: View next topic  
Author Message
x-code



Joined: 20 Mar 2012
Posts: 14

Post (Separately) Posted: Sat Nov 23, 2024 18:55    Post subject: Аргументы %P и %T и пути с пробелами Reply with quote

Добрый день!
Хочу добавить на панель инструментов некую кнопку с программой, которая принимает два аргумента - текущий путь одной панели и текущий путь другой панели. Вроде все просто, прописываю ей в аргументы %P %T
И это работает пока в путях не встречаются пробелы.
Как только пробелы встречаются - всё ломается. Коммандер по какой-то причине не оборачивает такие пути кавычками.
Попытка выставить кавычки вручную (написать "%P" "%T") также приводит к странным результатам. Открывающая кавычка просто выбрасывается, закрывающая остается. Для исследования этого вопроса я написал простейшую программу
Code:
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"
добавление кавычек в различных сочетаниях не помогает и приводит к другим странным результатам.
Что делать?
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2686

Post (Separately) Posted: Sat Nov 23, 2024 20:39    Post subject: Reply with quote

x-code
Чтобы узнать, какую точно строку параметров передаёт программе TC, воспользуйтесь знаком вопроса в начале строки параметров кнопки.
Quote:
?        В качестве первого символа параметров вызывает перед стартом программы диалоговое окно, содержащее указанные далее параметры. Вы можете изменить их перед стартом программы и даже отменить запуск.
Back to top
View user's profile Send private message
x-code



Joined: 20 Mar 2012
Posts: 14

Post (Separately) Posted: Sat Nov 23, 2024 22:03    Post subject: Reply with quote

sa
Спасибо! Тотал коммандер реабилитирован, но не совсемSmile
Оказалось что он все-же оборачивает строки в кавычки, НО пути формируемые аргументами %P и %T заканчиваются обратным слэшем. А тот код который разбивает буфер с аргументами командной строки на отдельные строки, т.е. формирует argc и argv (функция WinAPI CommandLineToArgvW) интерпретирует обратный слэш перед кавычкой как escape-последовательность и не удаляет кавычку.
Это является вполе задокументированным поведением
https://learn.microsoft.com/ru-ru/windows/win32/api/shellapi/nf-shellapi-commandlinetoargvw
Так что по идее нужно добиться Коммандера, чтобы он не ставил завершающий обратный слэш в конце путей. Ну или пусть использует все прямые слэши, для 99% программ это то же самое.
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2686

Post (Separately) Posted: Sat Nov 23, 2024 22:17    Post subject: Reply with quote

x-code wrote:
чтобы он не ставил завершающий обратный слэш в конце путей

Quote:
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.

Или здесь:
Quote:
Все параметры наподобие %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. Для вставки в этом месте самого символа тильды его нужно будет удвоить.
Back to top
View user's profile Send private message
x-code



Joined: 20 Mar 2012
Posts: 14

Post (Separately) Posted: Sat Nov 23, 2024 23:08    Post subject: Reply with quote

Посмотрел внимательнее, оказалось что Коммандер ставит кавычки для сочетаний %P%N и %T%N, только в случае если в пути имеются пробелы.
А просто для %P и %T не ставит никогда
Так что вариант %P:~0,-1 применим только для %P и %T
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2686

Post (Separately) Posted: Sat Nov 23, 2024 23:21    Post subject: Reply with quote

x-code wrote:
Коммандер ставит кавычки для сочетаний %P%N и %T%N, только в случае если в пути имеются пробелы

Используйте параметр %Q (описание из справки по предыдущей ссылке):
Quote:
%Q     Отключает автоматическое добавление кавычек вокруг определённых параметров …таких как %P%N, при наличии пробелов в именах/путях. В этом случае пользователю следует добавлять кавычки самостоятельно.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Общие вопросы All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group