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%s2
Goto page 1, 2  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Общие вопросы printer-friendly view
View previous topic :: View next topic  
Author Message
gryja



Joined: 21 Nov 2016
Posts: 13

Post (Separately) Posted: Mon Nov 21, 2016 01:02    Post subject: Неправильно генерируются короткие имена по шаблону %p%s2 Reply with quote

При нажатии на кнопку "Показать все файлы без подкаталогов" и при выборе двух файлов (а иногда - и одного) неправильно генерируются короткие имена по шаблону %p%s2 для передачи в параметры сторонних программ, например, для открытия файла в шестнадцатеричном редакторе. Я не знаю - баг это, или фича, но такое было в 7-й версии, и сейчас осталось в 8-й.
Back to top
View user's profile Send private message
Rodny



Joined: 24 Jan 2007
Posts: 949
Location: Могилёв, Беларусь

Post (Separately) Posted: Mon Nov 21, 2016 02:23    Post subject: Reply with quote

gryja
Примеры? Не вижу никакой разницы между режимами. Проверял кнопкой
Code:
TOTALCMD#BAR#DATA
cmd
?%p%s2
C:\Windows\system32\cmd.exe


0
-1
Back to top
View user's profile Send private message
gryja



Joined: 21 Nov 2016
Posts: 13

Post (Separately) Posted: Mon Nov 21, 2016 03:22    Post subject: Reply with quote

Например, файл "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"
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Mon Nov 21, 2016 11:12    Post subject: Reply with quote

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

А зачем в 21-м веке использовать короткие имена? Что за батники такие особенные, которые не работают с длинными?
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
gryja



Joined: 21 Nov 2016
Posts: 13

Post (Separately) Posted: Mon Nov 21, 2016 14:42    Post subject: Reply with quote

Команда:
Code:
[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""

Сам батник:
Code:
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".
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Mon Nov 21, 2016 15:32    Post subject: Reply with quote

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

А какая цель у батника? Какой-то он странный, ИМХО.
Кстати, вот эта строка в батнике явно лишняя:
Code:
"%~dp0..\..\TOTALCMD.EXE" /O


Что касается лишних папок в путях, то да - это баг для %p. Он берёт не общий родительский каталог, а вычленяет его из элемента под курсором.
MVV, сообщишь?
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
Avada



Joined: 01 Aug 2008
Posts: 10259
Location: Россия, Саратов

Post (Separately) Posted: Mon Nov 21, 2016 17:07    Post subject: Reply with quote

gryja
Сообщение с кодами приведено в пристойный вид. Впредь будьте добры делать это самостоятельно. Про остальное сказано выше.
_________________
Даже самая богатая фантазия
Не представит себе наши безобразия.
Back to top
View user's profile Send private message
gryja



Joined: 21 Nov 2016
Posts: 13

Post (Separately) Posted: Mon Nov 21, 2016 17:13    Post subject: Reply with quote

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

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

В седьмой версии строка
Code:
"%~dp0..\..\TOTALCMD.EXE" /O

была не нужна; в восьмой она нужна, когда тотал висит в трее - сначала вытащить тотал из трея, затем - перейти в папку.

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

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

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

Если убрать кавычки, то строка не сработает. Команда Set остановится только в конце строки.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Mon Nov 21, 2016 17:52    Post subject: Reply with quote

Дело в том, что возвращаемые приведёнными параметрами пути оборачиваются в кавычки только при наличии пробелов. Соответственно, Set будет добавлять в таких случаях доп. кавычки. Лучше батнику передавать параметры, убивать лишние кавычки батником и после передавать переменные в SET.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
gryja



Joined: 21 Nov 2016
Posts: 13

Post (Separately) Posted: Mon Nov 21, 2016 19:23    Post subject: Reply with quote

Кавычки нужны именно здесь:
Code:
param="SET NAME1="%T%M"&SET NAME2="%P%S2"&"%%COMMANDER_PATH%%\Soft\NirSoft\CompArc.bat""
, иначе %NAME1% будет равна всей строке до конца, %NAME2% будет отсутствовать как переменная, а батник CompArc.bat вообще не запустится.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Mon Nov 21, 2016 19:27    Post subject: Reply with quote

gryja
Что в моём последнем предложении непонятно?
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
gryja



Joined: 21 Nov 2016
Posts: 13

Post (Separately) Posted: Mon Nov 21, 2016 19:32    Post subject: Reply with quote

Вот эта строка непонятна:
Quote:
после передавать переменные в SET.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Mon Nov 21, 2016 19:48    Post subject: Reply with quote

gryja
Пожалуй, тут надо отказаться от %s в пользу %WL: nircmd.exe execmd test.bat %T%M %WL
А дальше в батнике обрабатывать %1 и %2 (список).
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Mon Nov 21, 2016 20:07    Post subject: Reply with quote

gryja,
Крайне не советую в переменные окружения в кавычках что-то класть. Кавычки надо ставить вокруг мест использования переменных и параметров, которые потенциально могут содержать пробелы. Если надо обозначить конец значения переменной при установке, можно брать в кавычки её имя и значение:
Code:
SET "NAME1=%T%M" & SET "NAME2=%P%S2" ...


Но вообще, конечно, правильнее передавать батнику параметры через параметры, а не через переменные, да и кучу путей передавать правильнее через %WL, как предложил Flasher.

Баг зарепортил.
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
gryja



Joined: 21 Nov 2016
Posts: 13

Post (Separately) Posted: Mon Nov 21, 2016 22:31    Post subject: Reply with quote

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

Про возможность конструкции
Code:
SET "NAME1=%T%M" & SET "NAME2=%P%S2" ...
я не подозревал. Буду тестить. Спасибо.
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
Goto page 1, 2  Next
Page 1 of 2

 
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