@IMStrelcov спасибо! можете пояснить его работу? не смог заставить его переименовывать файлы
а если я выделяю эти файлы в папке и перетягиваю на скрипт? не через $CmdLine[0]
Сообщение автоматически объединено:
на данный момент я пришёл к такому cmd варианту, я просто перетаскиваю файл model_LOD0.sem на исполняемый .cmd и получаю необходимый результат. скрипт:
При перетаскивании файлов на готовый скрипт (EXE), скрипт будет запускаться для каждого файла и папки отдельно, то есть всегда будет получаться что файл для переименования в списке один, а не два и более, как требуется. И это я не только о своем коде, а в общем. Что бы обойти это, используйте
FileFindFirstFile() для создания списка файлов, которые требуется переименовать, и на скрипт перетаскивайте папку где лежат файлы. В моем примере список берется из отдельного ранее подготовленного файла, для примера. То есть вам остается реализовать создание списка файлов.
Пробуйте такой вариант:
Код:
;скомпилируйте скрипт и на EXE перетяните папку с файлами;подпапки не учитываются;учитывайте, что скрипт не выводит никаких сообщений об успехе или ошибке переименовавния;если скрипт не сможет переименовать, к примеру 1-й и последний файл, то он вернет им первоначальные имена;то есть 1 переименовали в 1tmp;а 6 в 6tmp не удалось;тогда бывший 1, теперь 1tmp, переименует назад в 1;если удалось и 6 переименовать в 6tmp;тогда переименовываем дальше;6tmp в 1, а 1tmp в 6 и т.д. с другими файлами;перебираем список комманд запуска, ища в нем папку, в которой лежат файлыFor$i1=1To$CmdLine[0];если это папка, то создаем список файлов лежащих в ней, не папокIfStringInStr(FileGetAttrib($CmdLine[$i1]),'D')Then$vList=''$hList=FileFindFirstFile($CmdLine[$i1]&'\*.*')While1$sFile=FileFindNextFile($hList)If@errorThenExitLoopIfNotStringInStr(FileGetAttrib($CmdLine[$i1]&'\'&$sFile),'D')Then$vList&=$sFile&@CRLFWEndFileClose($hList)$vList=StringRegExpReplace($vList,'(?imsx)([\v]+\z)','')$vList=StringSplit($vList,@CRLF,1);переименовываем файлы беря 1-й файл в списке и последний;потом 2-й и предпоследний и т.д.$iBegin=1$iEnd=$vList[0]While($iBegin<=$iEnd)If$vList[$iBegin]<>$vList[$iEnd]Then;эти две переменные для временного именования файла, требуется чтобы не перезаписать существующие файлы$sBegin=@YEAR&@MON&@MDAY&@HOUR&@MIN&@SEC&@MSEC&'.Begin'$sEnd=@YEAR&@MON&@MDAY&@HOUR&@MIN&@SEC&@MSEC&'.End'FileMove($CmdLine[$i1]&'\'&$vList[$iBegin],$CmdLine[$i1]&'\'&$vList[$iBegin]&$sBegin,9)If@errorThenExitLoopFileMove($CmdLine[$i1]&'\'&$vList[$iEnd],$CmdLine[$i1]&'\'&$vList[$iEnd]&$sEnd,9)If@errorThenFileMove($CmdLine[$i1]&'\'&$vList[$iBegin]&$sBegin,$CmdLine[$i1]&'\'&$vList[$iBegin],9)ExitLoopEndIfFileMove($CmdLine[$i1]&'\'&$vList[$iBegin]&$sBegin,$CmdLine[$i1]&'\'&$vList[$iEnd],9)FileMove($CmdLine[$i1]&'\'&$vList[$iEnd]&$sEnd,$CmdLine[$i1]&'\'&$vList[$iBegin],9)EndIf$iBegin+=1$iEnd-=1WEndEndIfNextMsgBox(0,0,'Срипт окончил работу')
И учтите что список может быть составлен не правильно, так как у системы или AutoIt-а свои критерии сортировки файлов по имени, из-за чего может быть что файл который должен быть в начале списка, окажется в середине списка, и тогда произойдет не тот результат который вам нужен, вот почему я для первого примера брал список файлов из заранее готового файла.