|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - имя "входящего" файла без расширения |
|
CMD/BAT - имя "входящего" файла без расширения
|
Новый участник Сообщения: 40 |
Профиль | Сайт | Отправить PM | Цитировать подскажите, может ли командная строка какой-либо переменной возвращать только ИМЯ "входящего" файла (мышкой закинутый в "Открыть с помощью" данного батника) без расширения? поясню, например, мне нужно переименовать расширение файла, а не добавить поверх существующего новое таким кодом:
|
|
Отправлено: 08:26, 15-06-2010 |
Ветеран Сообщения: 2708
|
Профиль | Отправить PM | Цитировать Цитата DonQuixote, не понимаю Ваш код:
Лучше не приводите код, а объясните задачу: У Вас есть группа файлов. Маску можете указать? Каждый из этих файлов надо переименовать. Впереди имени файла и сзади имени файла (перед расширением) что-то надо добавить. Что? Пишу наугад, так как не очень понимаю постановку задачи
@Echo Off Set "BINDIR=Z:\Tra La La" Set "Mask=ForgeAmidst-*.jar" Set "Pref=1_" Set "Suff=-FAXV" FOR /F "usebackq delims=" %%f IN (`dir /b "%BINDIR%\%Mask%" 2^>nul`) DO Ren "%BINDIR%\%%f" "%Pref%%%~nf%Suff%%%~xf" Перед именем добавляем префикс %Pref% (Здесь 1_) Выделяем из имени файла только имя без расширения %%~nf (например, ForgeAmidst-1.1.1) После него прибавляем суффикс %Suff% (здесь -FAXV) После суффикса выделяем из исходного имени файла расширение %%~xf (например, .jar) Как результат получаем переименованный файл 1_ForgeAmidst-1.1.1-FAXV.jar Откуда у Вас берётся еще GUImap_ не понимаю. |
|
------- Последний раз редактировалось megaloman, 29-12-2016 в 18:08. Отправлено: 17:30, 29-12-2016 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 52
|
Профиль | Отправить PM | Цитировать orgFILE обычная переменная..строка была длинная я укоротил)
for /f "tokens=*" %%a in ('dir /b "%BINDIR%FullThrottleNEI-*.jar"') do ren "%BINDIR%%%a" "%Rnam%GUI_3_S_%%a" я пока сдела так как выше set poi1=.jar For %%i In ("%BINDIR%Schematica-*%poi1%") Do Set FILENAME=%%~ni ren "%BINDIR%%FILENAME%%poi1%" "%Rnam%INFO3_ADMIN_WD_%FILENAME%-FAxV%poi1%" но мне надо бы в 1 строчку все это дело... маска файла всегда разная...я просто создаю новую строчку с нужным именем вот пример файлов. FullThrottleNEI-*.jar бывают и зип Schematica-*.zip имя тоже разное щас у меня 1800 строк в коде.... разделить на попалам.(из за найденого способа на пред. странице) "Каждый из этих файлов надо переименовать." не все..тока те что подходят под маску,которую я указываю сам. "Впереди имени файла и сзади имени файла (перед расширением) что-то надо добавить. Что?" тут нет чего то одного..всегда разное [/code] тут скажем в начале переменная %Rnam%+INFO3_ADMIN_WD_ имя файла -FAxV расширение. конец и начал могут быть разные.. это я тоже сам указываю. ваш код вроде подходит..проверю потом спасибо) "Откуда у Вас берётся еще GUImap_ не понимаю." я его сам сую в код... в итоге после переделки код будет такой: Set "BINDIR=Z:\Tra La La" Set "Rnam=1_" FOR /F "usebackq delims=" %%f IN (`dir /b "%BINDIR%\ForgeAmidst-*.jar" 2^>nul`) DO Ren "%BINDIR%\%%f" "%Rnam%INFO3_ADMIN_WD_%%~nf-FAXV%%~xf" код пашет)) а можно ли добавить в эту же строку(без второй) команду что то типа echo %%f что бы выводило в консоль имя файла или полный путь... скажем выводила те файлы которые переименованы уже конечным именем и те файлы которые не были найден? |
Последний раз редактировалось DonQuixote, 29-12-2016 в 23:21. Отправлено: 22:49, 29-12-2016 | #12 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать DonQuixote, если Вы внутри цикла for каким-либо образом меняете имена найденных из набора файлов таким образом, что новое имя тоже подпадает под указанный в for набор файлов — то могут быть проблемы: какие-то файлы могут остаться необработанными, какие-то — могут быть обработаны многократно. Чтобы избежать этого, вместо цикла for используется цикл разбора по for /f с выводом стандартного потока команды dir.
P.S. Для цитирования используйте тэг «quote». |
Отправлено: 01:10, 30-12-2016 | #13 |
Ветеран Сообщения: 2708
|
Профиль | Отправить PM | Цитировать Цитата:
Вот вариант
@Echo Off Set "LogFile=%Tmp%\%~n0.log" Del "%LogFile%" 2>nul Call :FRen "Z:\Tra La La\ForgeAmidst-*.jar" "1_GUImap_" "-FAXV" Call :FRen "Z:\Tra La La\Schematica-*.jar" "1_ADMIN_WD_" "-FAxV" Call :FRen "Z:\Tra La La\S3chematica-*.jar" "1_ADMIN_WD_" "-FAxV" Notepad "%LogFile%" GoTo :Eof :FRen If Exist %1 ( FOR /F "usebackq delims=" %%f IN (`dir /b %1 2^>nul`) DO ( Move /Y "%~dp1%%f" "%~dp1%~2%%~nf%~3%%~xf" >nul If Exist "%~dp1%~2%%~nf%~3%%~xf" ( Echo +++ "%~dp1%%f" ----^> "%~2%%~nf%~3%%~xf" >>"%LogFile%" ) Else ( Echo ??? not renamed "%~dp1%%f" ----^> "%~2%%~nf%~3%%~xf" >>"%LogFile%" ) ) ) Else ( Echo --- %1 not found >>"%LogFile%" ) GoTo :Eof |
|
------- Последний раз редактировалось megaloman, 30-12-2016 в 16:15. Отправлено: 16:02, 30-12-2016 | #14 |
Пользователь Сообщения: 52
|
Профиль | Отправить PM | Цитировать Iska, я с CMD не очень..просто собираю то тут то там кусочки...так что не понял о чём вы.точнее как реализовать.
знаю что FOR /F "usebackq delims=" %%f IN (`dir /b "%BINDIR%\ForgeAmidst-*.jar" 2^>nul`) DO Ren "%BINDIR%\%%f" "%Rnam%INFO3_ADMIN_WD_%%~nf-FAXV%%~xf" Цитата megaloman:
Цитата megaloman:
просто если есть возможность выводить в косоль имена файлов как я выше описал,добавив что то дополнительное к команде то хорошо.. я просбовал так FOR /F "usebackq delims=" %%f IN (`dir /b "%BINDIR%\ForgeAmidst-*.jar" 2^>nul`) DO Ren "%BINDIR%\%%f" "%Rnam%INFO3_ADMIN_WD_%%~nf-FAXV%%~xf" $ echo %%f с виду код ваш не подойдёт.. для примера покажу кусочек полного кода своего. @echo off SET BINDIR=%~dp0 CD /D "%BINDIR%" set poi1=jar* set poi2=zip* set poi3=litemod* set orgFILE=%BINDIR%%%a goto start :start Set "Suff=-FAxV" FOR /F "usebackq delims=" %%f IN (`dir /b "%BINDIR%ForgeAmidst-*.jar" 2^>nul`) DO Ren "%BINDIR%%%f" "%Rnam%GUImap_%%~nf%Suff%%%~xf" FOR /F "usebackq delims=" %%f IN (`dir /b "%BINDIR%VoidMonster 1*.jar" 2^>nul`) DO Ren "%BINDIR%%%f" "%Rnam%MOB_RM_%%~nf%Suff%%%~xf" FOR /F "usebackq delims=" %%f IN (`dir /b "%BINDIR%CondensedOres 1*.jar" 2^>nul`) DO Ren "%BINDIR%%%f" "%Rnam%RM_%%~nf%Suff%%%~xf" FOR /F "usebackq delims=" %%f IN (`dir /b "%BINDIR%MeteorCraft 1*.jar" 2^>nul`) DO Ren "%BINDIR%%%f" "%Rnam%RM_%%~nf%Suff%%%~xf" set Rnam=_IMI_ FOR /F "usebackq delims=" %%f IN (`dir /b "%BINDIR%dimensional-anchor-59*.jar" 2^>nul`) DO Ren "%BINDIR%%%f" "0CH_0%Rnam%%%~nf%Suff%%%~xf" FOR /F "usebackq delims=" %%f IN (`dir /b "%BINDIR%immibis-core-59*.jar" 2^>nul`) DO Ren "%BINDIR%%%f" "LIB%Rnam%%%~nf%Suff%%%~xf" FOR /F "usebackq delims=" %%f IN (`dir /b "%BINDIR%adv-repulsion-systems-59*.jar" 2^>nul`) DO Ren "%BINDIR%%%f" "2_1%Rnam%%%~nf%Suff%%%~xf" FOR /F "usebackq delims=" %%f IN (`dir /b "%BINDIR%advanced-machines-59*.jar" 2^>nul`) DO Ren "%BINDIR%%%f" "2_1%Rnam%%%~nf%Suff%%%~xf" FOR /F "usebackq delims=" %%f IN (`dir /b "%BINDIR%tubestuff-59*.jar" 2^>nul`) DO Ren "%BINDIR%%%f" "0%Rnam%%%~nf%Suff%%%~xf" FOR /F "usebackq delims=" %%f IN (`dir /b "%BINDIR%autofood-59*.jar" 2^>nul`) DO Ren "%BINDIR%%%f" "4%Rnam%%%~nf%Suff%%%~xf" то есть желательно, да и удобнее было что в тут же строку написать, но с $ (нашёл в инете) не получается. если интересно вкраце, бат файл мне нужен для того что бы переименовать новые версии файлов, пример: "ForgeAmidst-1.jar ForgeAmidst-2.jar ForgeAmidst-04.jar ForgeAmidst-06.jar" присваивая им в начале имени что то конкретное для данного файла и в конце, так как делать это руками было очень напряжно. батник выше справляется)спс megaloman я таким образом группировал их. |
||
Отправлено: 19:07, 30-12-2016 | #15 |
Ветеран Сообщения: 2708
|
Профиль | Отправить PM | Цитировать Цитата DonQuixote:
Вот Ваш пример с помощью контекстной замены
@echo off Pushd "%~dp0" Set "LogFile=%Tmp%\%~n0.log" Del "%LogFile%" 2>nul Call :FRen "ForgeAmidst-*.jar" "GUImap_" "-FAxV" Call :FRen "VoidMonster 1*.jar" "MOB_RM_" "-FAxV" Call :FRen "CondensedOres 1*.jar" "RM_" "-FAxV" Call :FRen "MeteorCraft 1*.jar" "RM_" "-FAxV" Call :FRen "dimensional-anchor-59*.jar" "0CH_0_IMI_" "-FAxV" Call :FRen "immibis-core-59*.jar" "LIB_IMI_" "-FAxV" Call :FRen "adv-repulsion-systems-59*.jar" "2_1_IMI_" "-FAxV" Call :FRen "advanced-machines-59*.jar" "2_1_IMI_" "-FAxV" Call :FRen "tubestuff-59*.jar" "0_IMI_" "-FAxV" Call :FRen "autofood-59*.jar" "4_IMI_" "-FAxV" Popd Notepad "%LogFile%" GoTo :Eof :FRen If Exist %1 ( FOR /F "usebackq delims=" %%f IN (`dir /b %1 2^>nul`) DO ( Move /Y "%~dp1%%f" "%~dp1%~2%%~nf%~3%%~xf" >nul If Exist "%~dp1%~2%%~nf%~3%%~xf" ( Echo +++ "%~dp1%%f" ----^> "%~2%%~nf%~3%%~xf" >>"%LogFile%" ) Else ( Echo ??? not renamed "%~dp1%%f" ----^> "%~2%%~nf%~3%%~xf" >>"%LogFile%" ) ) ) Else ( Echo --- %1 not found >>"%LogFile%" ) GoTo :Eof |
|
------- Отправлено: 20:09, 30-12-2016 | #16 |
Пользователь Сообщения: 52
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
А кто Вас в этом убедил? » ну я не спец) то есть мне в строчки Call :FRen "dimensional-anchor-59*.jar" "0CH_0_IMI_" "-FAxV" Call :FRen "immibis-core-59*.jar" "LIB_IMI_" "-FAxV" Call :FRen "adv-repulsion-systems-59* FOR /F "usebackq delims=" %%f IN (`dir /b "%BINDIR%immibis-core-59*.jar" 2^>nul`) DO Ren "%BINDIR%%%f" "LIB%Rnam%%%~nf%Suff%%%~xf" если так то надо будет проверить) а там нет ошибки в строках GoTo :Eof ? не вижу этой :Eof с виду просто идеально!!!благодарю всех за помощью..щас буду делать поиск и замену по своему батнику.. |
Последний раз редактировалось DonQuixote, 30-12-2016 в 20:35. Отправлено: 20:28, 30-12-2016 | #17 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата DonQuixote:
Цитата DonQuixote:
FOR /F "usebackq delims=" %%f IN (`dir /b "%BINDIR%\ForgeAmidst-*.jar" 2^>nul`) DO (Ren "%BINDIR%\%%f" "%Rnam%INFO3_ADMIN_WD_%%~nf-FAXV%%~xf" & echo "%Rnam%INFO3_ADMIN_WD_%%~nf-FAXV%%~xf") Цитата DonQuixote:
|
|||
Отправлено: 20:32, 30-12-2016 | #18 |
Ветеран Сообщения: 2708
|
Профиль | Отправить PM | Цитировать DonQuixote, нужно просто вставить свои имена в вызов Call из 1000 строк и будет тоже самое что и с For тока ещё и с логом. Eof - end of file, эту метку писать не надо, так что ошибки нет. Необходимо, чтобы после окончания главной части командного файла не выполнялась процедура. Из командного окна запускаем GoTo /? и читаем хелп.
|
------- Последний раз редактировалось megaloman, 30-12-2016 в 20:46. Отправлено: 20:37, 30-12-2016 | #19 |
Пользователь Сообщения: 52
|
Профиль | Отправить PM | Цитировать Цитата Iska:
Чем Вас не устраивает отдельная строка? » так как файлов много..и самих строк естесвенно....в две строки не удобно..что менять или исправлять...вот как выше я щас будут менять FOR /F "usebackq delims=" %%f IN (`dir /b "%BINDIR%dimensional-anchor-59*.jar" 2^>nul`) DO Ren "%BINDIR%%%f" "0CH_0%Rnam%%%~nf%Suff%%%~xf" придётся по возится...так как плохо знаю регулярные выражения Цитата Iska: Это какие? » как по примеру от megaloman, его батник это делает через txt всем спасибо всех с наступающим))) |
Последний раз редактировалось DonQuixote, 30-12-2016 в 22:48. Отправлено: 20:39, 30-12-2016 | #20 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Почему Windows при запуске файла с именем "start.exe" показывает кнопки как "Пуск"? | Котяра | Хочу все знать | 9 | 22-06-2009 13:48 | |
Подмена файла "hosts" для запрета "Одноклассников" | D_Master | Хочу все знать | 10 | 17-10-2008 15:40 | |
Dial-Up - Недоступно "высокоскоростное подключение запрашивающее имя пользователя и пароль" | XaHyMaH | Сетевые технологии | 4 | 19-04-2008 14:31 | |
Изменение "Мой компьютер" на "Имя текущего пользователя на имя компьютера" | shcval | Microsoft Windows 2000/XP | 1 | 15-12-2006 21:01 | |
Запретить/удалить пункт "Programs" ("Программы") из меню кнопки "Start" ("Пуск") | submaster | Microsoft Windows NT/2000/2003 | 5 | 13-09-2006 12:29 |
|