Неправильно генерируются короткие имена по шаблону %p%s2

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

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

gryja
Сообщения: 13
Зарегистрирован: Вс ноя 20, 2016 23:43

Неправильно генерируются короткие имена по шаблону %p%s2

Сообщение gryja »

При нажатии на кнопку "Показать все файлы без подкаталогов" и при выборе двух файлов (а иногда - и одного) неправильно генерируются короткие имена по шаблону %p%s2 для передачи в параметры сторонних программ, например, для открытия файла в шестнадцатеричном редакторе. Я не знаю - баг это, или фича, но такое было в 7-й версии, и сейчас осталось в 8-й.
Аватара пользователя
Rodny
Сообщения: 949
Зарегистрирован: Ср янв 24, 2007 00:59
Откуда: Могилёв, Беларусь

Сообщение Rodny »

gryja
Примеры? Не вижу никакой разницы между режимами. Проверял кнопкой

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

TOTALCMD#BAR#DATA
cmd
?%p%s2
C:\Windows\system32\cmd.exe


0
-1
gryja
Сообщения: 13
Зарегистрирован: Вс ноя 20, 2016 23:43

Сообщение gryja »

Например, файл "d:\!!!Downloads\!!!Ready\!!!Games\Valve\Half-Life\Config.rar" не открывается редактором "%COMMANDER_PATH%\Soft\HxD\HxD.exe", когда много файлов показывается без подкаталогов, в параметрах запуска стоит %p%s; но открывается, когда %P%S. Кроме того, часто вместо коротких имён генерируется длинные. У меня написано несколько батников, которых я запускаю через NirCMD, и длинные пути на передачу не прокатывают, нужны короткие.

Добавлено спустя 13 минут:

Вот такой вот путь сгенерировало: "d:\!!!DOW~1\!!!Ready\!!!Games\Valve\Half-Life\Valve\Half-Life\Config.rar"
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Хм, странно, имена папок Half-Life должны быть в другом формате. Может, у них просто нет коротких имен?

А зачем в 21-м веке использовать короткие имена? Что за батники такие особенные, которые не работают с длинными?
gryja
Сообщения: 13
Зарегистрирован: Вс ноя 20, 2016 23:43

Сообщение gryja »

Команда:

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

[em_NirCMD_11]
cmd=%COMMANDER_PATH%\Soft\NirSoft\NirCMD.exe EXECMD
param="SET NAME1="%T%M"&SET NAME2="%P%S2"&"%%COMMANDER_PATH%%\Soft\NirSoft\CompArc.bat""
Сам батник:

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

SET NAME1=%NAME1:"=%
SET NAME2=%NAME2:"=%
SET A=%NAME2:~2%
IF "%A%"=="%A::=%" GOTO ONE
SET NAME1=%A:*:=%
CALL SET NAME2=%%NAME2:%NAME1%=%%
SET NAME1=%NAME2:~-2%%NAME1%
SET NAME2=%NAME2:~0,-3%
:ONE
IF "%NAME1%"=="%NAME2%" EXIT
FOR %%I IN ("%NAME1%") DO SET D=%%~zI&SET D1=%%~xI
IF %D%==0 EXIT
FOR %%I IN ("%NAME2%") DO SET D=%%~zI&SET D2=%%~xI&SET DP=%%~dpI
IF %D%==0 EXIT
IF EXIST "%DP%3" EXIT
IF /I %D1%%D2%==.RAR.RAR (
"%~dp0..\..\Plugins\arc\WinRAR.exe" T "%NAME1%"
IF ERRORLEVEL 1 EXIT
"%~dp0..\..\Plugins\arc\WinRAR.exe" T "%NAME2%"
IF ERRORLEVEL 1 EXIT
"%~dp0..\..\Plugins\arc\WinRAR.exe" X -Y -CFG- "%NAME1%" "%DP%3\1\"
IF ERRORLEVEL 1 RD /S /Q "%DP%3"&"%~dp0..\..\TOTALCMD.EXE" /O /S /L="%DP%"&EXIT
"%~dp0..\..\Plugins\arc\WinRAR.exe" X -Y -CFG- "%NAME2%" "%DP%3\2\"
IF ERRORLEVEL 1 RD /S /Q "%DP%3"&"%~dp0..\..\TOTALCMD.EXE" /O /S /L="%DP%"&EXIT
) ELSE (
"%~dp0..\..\Plugins\wcx\Total7zip\7zG.exe" T "%NAME1%"
IF ERRORLEVEL 1 EXIT
"%~dp0..\..\Plugins\wcx\Total7zip\7zG.exe" T "%NAME2%"
IF ERRORLEVEL 1 EXIT
"%~dp0..\..\Plugins\wcx\Total7zip\7zG.exe" X -Y -O"%DP%3\1" "%NAME1%"
IF ERRORLEVEL 1 RD /S /Q "%DP%3"&"%~dp0..\..\TOTALCMD.EXE" /O /S /L="%DP%"&EXIT
"%~dp0..\..\Plugins\wcx\Total7zip\7zG.exe" X -Y -O"%DP%3\2" "%NAME2%"
IF ERRORLEVEL 1 RD /S /Q "%DP%3"&"%~dp0..\..\TOTALCMD.EXE" /O /S /L="%DP%"&EXIT
)
"%~dp0..\..\Soft\WinDiff\WinDiff.exe" "%DP%3\1" "%DP%3\2"
"%~dp0..\..\TOTALCMD.EXE" /O
"%~dp0..\..\TOTALCMD.EXE" /O /S /L="%DP%3"
Вся фишка в том, что слишком длинные пути не вмещаются в командную строку, либо если в именах слишком много пробелов - вылетает ошибка.

Добавлено спустя 3 минуты:

И не только имя Half-Life не переводится в короткое, часто и другие имена - тоже, причём закономерность я так и не нашёл.

Добавлено спустя 30 минут:

Кстати, путь "d:\!!!DOW~1\!!!Ready\!!!Games\Valve\Half-Life\Valve\Half-Life\Config.rar" неправильно сгенерирован не только с точки зрения коротких имён. Правильный путь - "d:\!!!Downloads\!!!Ready\!!!Games\Valve\Half-Life\Config.rar", то есть, "Valve\Half-Life" повторяется два раза. При просмотре я находился в каталоге "d:\!!!Downloads\!!!Ready\!!!Games\". При нахождении в каталоге "d:\!!!Downloads\!!!Ready\" генерируется путь "d:\!!!DOW~1\!!!Ready\!!!Games\Valve\Half-Life\!!!Games\Valve\Half-Life\Config.rar".
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

gryja
Где BBCode? Лучше обернуть, не ждите злых модераторов.
И чтобы облегчать задачу проверяющим приводите код кнопки вместо куска из ini-файла с пользовательской командой. Тут это норма.
gryja писал(а):либо если в именах слишком много пробелов
Т.е. при одном пробеле ошибки нет? :o
А если убрать кавычки вокруг %T%M?

А какая цель у батника? Какой-то он странный, ИМХО.
Кстати, вот эта строка в батнике явно лишняя:

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

"%~dp0..\..\TOTALCMD.EXE" /O
Что касается лишних папок в путях, то да - это баг для %p. Он берёт не общий родительский каталог, а вычленяет его из элемента под курсором.
MVV, сообщишь?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

gryja
Сообщение с кодами приведено в пристойный вид. Впредь будьте добры делать это самостоятельно. Про остальное сказано выше.
Даже самая богатая фантазия
Не представит себе наши безобразия.
gryja
Сообщения: 13
Зарегистрирован: Вс ноя 20, 2016 23:43

Сообщение gryja »

Извиняюсь за невнимательность. Сразу не понял - что такое BBCode.

Добавлено спустя 5 минут:

В седьмой версии строка

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

"%~dp0..\..\TOTALCMD.EXE" /O
была не нужна; в восьмой она нужна, когда тотал висит в трее - сначала вытащить тотал из трея, затем - перейти в папку.

Сам батник распаковывает два архива, а затем - сравнивает распакованное при помощи программы WnDiff.

Добавлено спустя 5 минут:

И да, если пробелов не больше 6 (кажется), то ошибки чаще не бывает.

Если убрать кавычки, то строка не сработает. Команда Set остановится только в конце строки.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Дело в том, что возвращаемые приведёнными параметрами пути оборачиваются в кавычки только при наличии пробелов. Соответственно, Set будет добавлять в таких случаях доп. кавычки. Лучше батнику передавать параметры, убивать лишние кавычки батником и после передавать переменные в SET.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
gryja
Сообщения: 13
Зарегистрирован: Вс ноя 20, 2016 23:43

Сообщение gryja »

Кавычки нужны именно здесь:

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

param="SET NAME1="%T%M"&SET NAME2="%P%S2"&"%%COMMANDER_PATH%%\Soft\NirSoft\CompArc.bat""
, иначе %NAME1% будет равна всей строке до конца, %NAME2% будет отсутствовать как переменная, а батник CompArc.bat вообще не запустится.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

gryja
Что в моём последнем предложении непонятно?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
gryja
Сообщения: 13
Зарегистрирован: Вс ноя 20, 2016 23:43

Сообщение gryja »

Вот эта строка непонятна:
после передавать переменные в SET.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

gryja
Пожалуй, тут надо отказаться от %s в пользу %WL: nircmd.exe execmd test.bat %T%M %WL
А дальше в батнике обрабатывать %1 и %2 (список).
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

gryja,
Крайне не советую в переменные окружения в кавычках что-то класть. Кавычки надо ставить вокруг мест использования переменных и параметров, которые потенциально могут содержать пробелы. Если надо обозначить конец значения переменной при установке, можно брать в кавычки её имя и значение:

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

SET "NAME1=%T%M" & SET "NAME2=%P%S2" ...
Но вообще, конечно, правильнее передавать батнику параметры через параметры, а не через переменные, да и кучу путей передавать правильнее через %WL, как предложил Flasher.

Баг зарепортил.
gryja
Сообщения: 13
Зарегистрирован: Вс ноя 20, 2016 23:43

Сообщение gryja »

Я подумывал о работе со списком, но передумал, так как при запуске коммандера от имени пользователя с ограниченными правами список не работает. Кроме того, параметры командной строки, проставленные после батника рассматриваются не как параметры батника, а как параметры программы NirCMD. Запускать COMMAND.COM без NirCMD я не хочу, так как проблемы всё равно не решаются, а запуск от NirCMD выглядит красивее.

Про возможность конструкции

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

SET "NAME1=%T%M" & SET "NAME2=%P%S2" ...
я не подозревал. Буду тестить. Спасибо.
Ответить