View previous topic :: View next topic |
Author |
Message |
x-code
Joined: 20 Mar 2012 Posts: 14
|
(Separately) Posted: Sat Nov 23, 2024 18:55 Post subject: Аргументы %P и %T и пути с пробелами |
|
|
Добрый день!
Хочу добавить на панель инструментов некую кнопку с программой, которая принимает два аргумента - текущий путь одной панели и текущий путь другой панели. Вроде все просто, прописываю ей в аргументы %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 |
|
 |
sa
Joined: 29 Apr 2009 Posts: 2686
|
(Separately) Posted: Sat Nov 23, 2024 20:39 Post subject: |
|
|
x-code
Чтобы узнать, какую точно строку параметров передаёт программе TC, воспользуйтесь знаком вопроса в начале строки параметров кнопки.
Quote: | ? В качестве первого символа параметров вызывает перед стартом программы диалоговое окно, содержащее указанные далее параметры. Вы можете изменить их перед стартом программы и даже отменить запуск. |
|
|
Back to top |
|
 |
x-code
Joined: 20 Mar 2012 Posts: 14
|
(Separately) Posted: Sat Nov 23, 2024 22:03 Post subject: |
|
|
sa
Спасибо! Тотал коммандер реабилитирован, но не совсем
Оказалось что он все-же оборачивает строки в кавычки, НО пути формируемые аргументами %P и %T заканчиваются обратным слэшем. А тот код который разбивает буфер с аргументами командной строки на отдельные строки, т.е. формирует argc и argv (функция WinAPI CommandLineToArgvW) интерпретирует обратный слэш перед кавычкой как escape-последовательность и не удаляет кавычку.
Это является вполе задокументированным поведением
https://learn.microsoft.com/ru-ru/windows/win32/api/shellapi/nf-shellapi-commandlinetoargvw
Так что по идее нужно добиться Коммандера, чтобы он не ставил завершающий обратный слэш в конце путей. Ну или пусть использует все прямые слэши, для 99% программ это то же самое. |
|
Back to top |
|
 |
sa
Joined: 29 Apr 2009 Posts: 2686
|
(Separately) Posted: Sat Nov 23, 2024 22:17 Post subject: |
|
|
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 |
|
 |
x-code
Joined: 20 Mar 2012 Posts: 14
|
(Separately) Posted: Sat Nov 23, 2024 23:08 Post subject: |
|
|
Посмотрел внимательнее, оказалось что Коммандер ставит кавычки для сочетаний %P%N и %T%N, только в случае если в пути имеются пробелы.
А просто для %P и %T не ставит никогда
Так что вариант %P:~0,-1 применим только для %P и %T |
|
Back to top |
|
 |
sa
Joined: 29 Apr 2009 Posts: 2686
|
(Separately) Posted: Sat Nov 23, 2024 23:21 Post subject: |
|
|
x-code wrote: | Коммандер ставит кавычки для сочетаний %P%N и %T%N, только в случае если в пути имеются пробелы |
Используйте параметр %Q (описание из справки по предыдущей ссылке):
Quote: | %Q Отключает автоматическое добавление кавычек вокруг определённых параметров …таких как %P%N, при наличии пробелов в именах/путях. В этом случае пользователю следует добавлять кавычки самостоятельно. |
|
|
Back to top |
|
 |
|
|
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
|