Что нового

Использование больше 260 файлов при использовании $CmdLine[0]

Tosyk

Новичок
Сообщения
206
Репутация
0
Что я пытаюсь выполнить?
пишу обработчик файлов через $CmdLine[0]. так, на готовый EXE можно кинуть кучу файлов из эксплорера виндовс и получить на выходе конвертированные файлы. когда кидаю на EXE 260 файлов то скрипт работает, когда больше, например 261+ то скрипт говорит: Имя файла или его расширение имеет слишком большую длину

Как я это пытался/ась выполнить?
пробовал использовать FileGetShortName() везде где только можно, но оно не работает

Что я ожидаю от выполненных действии?
Мне нужно чтобы любое количество файлов конвертировалось за 1 проход

Что происходит на самом деле?
при конвертировании 261+ скрипт выдаёт ошибку о длинном пути
 

Prog

Продвинутый
Сообщения
537
Репутация
65
Обычно такое бывает когда длина командной строки больше 32768 символов.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Tosyk
По всей видимости это ограничение системы, и скрипт тут не причём. Попробуйте кинуть 261 файл (те же файлы) на другой exe, не аутоит.
Вот тут вроде описано как отключить данное поведение.
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
а реально ли такое для 7-ки провернуть? batch скрипты типа BAT, например, могут обрабатывать сколько угодно файлов же
 

Prog

Продвинутый
Сообщения
537
Репутация
65
Tosyk [?]
а реально ли такое для 7-ки провернуть? batch скрипты типа BAT, например, могут обрабатывать сколько угодно файлов же
Попробуйте выделить всю папку System32 и кинуть на BAT. Напишите что получится.
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
а какой для этого бат нужен? все скрипты, что я пишу обрабатывают только конкретные файлы, вот типа такого:

Код:
@Echo Off
For /F "Tokens=*" %%A In ('Dir /B /S *.ascii') Do (
	"C:\noesis\Noesis.exe" ?cmode ^
	"%%A" ^
	"%%~dpnA.fbx" ^
	-fbxnewexport ^
	-fbxexportver FBX201200
	)
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
ну в общем вот:

Код:
C:\Windows>echo C:\Windows\System32
C:\Windows\System32

C:\Windows>pause
Для продолжения нажмите любую клавишу . . .

а вообще как это поможет?
 

Prog

Продвинутый
Сообщения
537
Репутация
65
Нужно перетащить не папку, а открыть папку, выделить все файлы в ней и перетащить на батник.
Не обязательно System32. Нужна папка с несколькими тысячами файлов.
Можете также перетащить файлы на прогу в архиве. Она покажет, количество файлов, пути к ним и число символов командной строки.
 

Вложения

  • Files.zip
    23.8 КБ · Просмотры: 4

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Если нужно выделить и перетащить все файлы, то зачем это делать? Перетаскивай папку, а уже далее твой код найдет все файлы для обработки
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
Prog сказал(а):
Можете также перетащить файлы на прогу в архиве. Она покажет, количество файлов, пути к ним и число символов командной строки.
перетаскиваю 627 файлов и прога крашится - слишком длинное имя
 

Prog

Продвинутый
Сообщения
537
Репутация
65
При меньшем числе файлов число символов командной строки близко к 32768? Значит в винде или в explorer такое ограничение.
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
Да, длина ком. строки: 32691, всего файлов 261.

это можно как-то обойти? FileGetShortName(), например, не очень то работает, хотя в консоль выводит укороченные имена
 

Alecsis

Осваивающий
Сообщения
101
Репутация
41
CreatoR сказал(а):
Tosyk
По всей видимости это ограничение системы, и скрипт тут не причём
Это действительно так: ограничение — оно же макс. длина командной строки для функции CreateProcess, к-рая собсс-но и используется внутри Run/RunWait = 32767символов, а «ноги растут» из структуры UNICODE_STRING.
В случае cmd.exe всё ещё хуже, там согласно оф/сайту Microsoft лимит в 8191 символ…
Для обхода кмк проще было бы вывалить имена файлов в какой-нибудь временный, например, filelist.txt ну и чуток модернизировать скрипт, чтобы он тащил нужные имена из этого filelist'а. Тогда никаких лимитов.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Tosyk [?]
это можно как-то обойти?
Да, отказаться от метода с перетаскиванием (ну или оставить его в добавок) в пользу метода выбора файлов из самой программы. При запуске скрипта делать что то типа:

Код:
If $CmdLine[0] = 0 Then
	$aFiles = _FileOpenDialog_Parse('Select files:', '', 'Images (*.jpg;*.bmp*.png)', BitOR(1, 2, 4))
	If @error Then Exit
	
	;_ArrayDisplay($aFiles)
EndIf

Func _FileOpenDialog_Parse($sTitle, $sInitDir, $sFilter, $iOptions = 0, $sDefName = '', $hWnd = 0)
	Local $sFiles = FileOpenDialog($sTitle, $sInitDir, $sFilter, $iOptions, $sDefName, $hWnd)
	If @error Then Return SetError(1, 0, 0)
	
	Local $aFiles = StringSplit($sFiles, '|')
	
	If $aFiles[0] > 1 Then
		Local $sPath = $aFiles[1] & '\'
		
		For $i = 2 To $aFiles[0]
			$aFiles[$i - 1] = $sPath & $aFiles[$i]
		Next
		
		ReDim $aFiles[$aFiles[0]]
		$aFiles[0] -= 1
	Else
		Dim $aFiles[2] = [1, $sFiles]
	EndIf
	
	Return $aFiles
EndFunc


$aFiles это массив со списком файлов которые нужно обрабатывать.
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
CreatoR сказал(а):
Tosyk [?]Да, отказаться от метода с перетаскиванием (ну или оставить его в добавок) в пользу метода выбора файлов из самой программы. При запуске скрипта делать что то типа <...>
$aFiles это массив со списком файлов которые нужно обрабатывать.
а нельзя ли эти подходы объединить? у меня задача: выполнить конвертирование файлов перетаскиванием. Я добавляю ссылки на EXE в Send to и запускаю конвертирование выделением нужных файлов и ПКМ отправляю их в Send to
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Tosyk [?]
а нельзя ли эти подходы объединить?
Нет решения со стороны скрипта, это ограничение системы.
Возможно стоит поменять методику приёма файлов, посылать папку с файлами, а не сами файлы.
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
Возможно есть возможно передавать выбранные в эксплорере файлы в какой-то массив, а из массива уже передавать в этот приёмщик, который не имеет огрничений уже будет обрабатывать?

или же любые отправляемые файлы через Send To сталкиваются с этой системой винды, которая имеет ограничения?
 

Prog

Продвинутый
Сообщения
537
Репутация
65
Можно добавить пункт в меню проводника, как это делают архиваторы и другие программы. Тогда пути к файлам отправятся в функцию dll и вероятно не будет ограничения числа символов.
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
Prog сказал(а):
Можно добавить пункт в меню проводника, как это делают архиваторы и другие программы. Тогда пути к файлам отправятся в функцию dll и вероятно не будет ограничения числа символов.
о, интересно, можете поподробнее? как мне сделать из скрипт DLL?
 
Верх