Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - имя "входящего" файла без расширения

Ответить
Настройки темы
CMD/BAT - имя "входящего" файла без расширения

Аватара для Radiant

Новый участник


Сообщения: 40
Благодарности: 2

Профиль | Сайт | Отправить PM | Цитировать


подскажите, может ли командная строка какой-либо переменной возвращать только ИМЯ "входящего" файла (мышкой закинутый в "Открыть с помощью" данного батника) без расширения? поясню, например, мне нужно переименовать расширение файла, а не добавить поверх существующего новое таким кодом:
Код: Выделить весь код
MOVE %1 %1.AVI

Отправлено: 08:26, 15-06-2010

 

Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Цитата DonQuixote, не понимаю Ваш код:
ren "%orgFILE%" "%Rnam%GUImap_%%a"
Как я понимаю, некий файл с именем "%orgFILE%"в цикле переименовывается в "%Rnam%GUI_3_S_%%a" Очевидно, такое переименование возможно 1 раз (я пока не смотрю на остальной синтаксис), так как после первого раза файл уже не называется "%orgFILE%"
Лучше не приводите код, а объясните задачу:
У Вас есть группа файлов. Маску можете указать?
Каждый из этих файлов надо переименовать.
Впереди имени файла и сзади имени файла (перед расширением) что-то надо добавить. Что?
Пишу наугад, так как не очень понимаю постановку задачи
Код: Выделить весь код
@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"
В папке %BINDIR% есть файл %%f (например, ForgeAmidst-1.1.1.jar), который переименовываем:
Перед именем добавляем префикс %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
Благодарности: 4

Профиль | Отправить 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 строк в коде.... разделить на попалам.(из за найденого способа на пред. странице)

"Каждый из этих файлов надо переименовать."
не все..тока те что подходят под маску,которую я указываю сам.

"Впереди имени файла и сзади имени файла (перед расширением) что-то надо добавить. Что?"
тут нет чего то одного..всегда разное
Код: Выделить весь код
ren "%BINDIR%%FILENAME%%poi1%" "%Rnam%INFO3_ADMIN_WD_%FILENAME%-FAxV%poi1%"
[/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"
я думаю то что надо и вроде будет работать)) все такие код в 2 строки мне не удобен

код пашет))
а можно ли добавить в эту же строку(без второй) команду что то типа echo %%f что бы выводило в консоль имя файла или полный путь...
скажем выводила те файлы которые переименованы уже конечным именем и те файлы которые не были найден?

Последний раз редактировалось DonQuixote, 29-12-2016 в 23:21.


Отправлено: 22:49, 29-12-2016 | #12


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


DonQuixote, если Вы внутри цикла for каким-либо образом меняете имена найденных из набора файлов таким образом, что новое имя тоже подпадает под указанный в for набор файлов — то могут быть проблемы: какие-то файлы могут остаться необработанными, какие-то — могут быть обработаны многократно. Чтобы избежать этого, вместо цикла for используется цикл разбора по for /f с выводом стандартного потока команды dir.

P.S. Для цитирования используйте тэг «quote».
Это сообщение посчитали полезным следующие участники:

Отправлено: 01:10, 30-12-2016 | #13


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Цитата:
...маска файла всегда разная...я просто создаю новую строчку с нужным именем...
...Каждый из этих файлов надо переименовать...
Впереди имени файла и сзади имени файла (перед расширением) ... надо добавить ... всегда разное
... но мне надо бы в 1 строчку все это дело...
... у меня 1800 строк в коде...
... добавить в эту же строку(без второй) команду, чтобы выводило в консоль имя файла или полный путь... скажем, выводила те файлы, которые переименованы уже конечным именем, и те файлы, которые не были найдены?
Чтобы сделать в одну строчку, я бы предложил написать процедуру и вызывать её для каждой маски файла. В аргументах: маска файла с путём (если надо), префикс и суффикс при переименовании. Без процедуры может быть и возможно записать все ваши пожелания, но получится длинно и неудобно, я не берусь. Для 1800 строк сомневаюсь, что в консоли Вы что-то успеете увидеть, поэтому организую лог-файл, который потом можно смотреть текстовым редактором.
Вот вариант
Код: Выделить весь код
@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
Благодарности: 4

Профиль | Отправить 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:
Для 1800 строк сомневаюсь, »
я просто путём поиска и замены заменил весь код на предложенный вами.
просто если есть возможность выводить в косоль имена файлов как я выше описал,добавив что то дополнительное к команде то хорошо..
я просбовал так
Код: Выделить весь код
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 не срабатывает
с виду код ваш не подойдёт..
для примера покажу кусочек полного кода своего.
Код: Выделить весь код
@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"
и таких строчек штук 1000 и все они разные, с разными именами
то есть желательно, да и удобнее было что в тут же строку написать, но с $ (нашёл в инете) не получается.

если интересно
вкраце, бат файл мне нужен для того что бы переименовать новые версии файлов, пример: "ForgeAmidst-1.jar ForgeAmidst-2.jar ForgeAmidst-04.jar ForgeAmidst-06.jar" присваивая им в начале имени что то конкретное для данного файла и в конце, так как делать это руками было очень напряжно.
батник выше справляется)спс megaloman
я таким образом группировал их.

Отправлено: 19:07, 30-12-2016 | #15


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить 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
Благодарности: 4

Профиль | Отправить 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*
нужно просто вставить свои имена с из 1000 строк? и будет тоже самое что и
Код: Выделить весь код
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
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата 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"
для меня работает сечас замечательно »
Да, я про этот принцип и писал.

Цитата 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


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


DonQuixote, нужно просто вставить свои имена в вызов Call из 1000 строк и будет тоже самое что и с For тока ещё и с логом. Eof - end of file, эту метку писать не надо, так что ошибки нет. Необходимо, чтобы после окончания главной части командного файла не выполнялась процедура. Из командного окна запускаем GoTo /? и читаем хелп.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 30-12-2016 в 20:46.

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:37, 30-12-2016 | #19


Пользователь


Сообщения: 52
Благодарности: 4

Профиль | Отправить 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"
эту строчку на эту
Код: Выделить весь код
Call :FRen "dimensional-anchor-59*.jar"         "0CH_0%Rnam%"    "-FAxV"
придётся по возится...так как плохо знаю регулярные выражения
Цитата Iska:
Это какие? »
как по примеру от megaloman, его батник это делает через txt
Код: Выделить весь код
+++ "G:\MinecraftSBORKA\1_sborak\434\dimensional-anchor-59.0.3.jar" ----> "0CH_0_IMI_dimensional-anchor-59.0.3-FAxV.jar" 
--- "immibis-core-59*.jar" not found
всем спасибо всех с наступающим)))

Последний раз редактировалось DonQuixote, 30-12-2016 в 22:48.


Отправлено: 20:39, 30-12-2016 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - имя "входящего" файла без расширения

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Почему 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




 
Переход