PDA

Показать полную графическую версию : имя "входящего" файла без расширения


Страниц : [1] 2

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

amel27
15-06-2010, 08:33
переименовать расширение файла »REN "%~1" "%~n1.AVI"

Radiant
15-06-2010, 08:39
благодарю! работает)) а где можно почитать на тему подобных переменных?

amel27
15-06-2010, 08:47
где можно почитать на тему подобных переменных »FOR /?

SharkyEXE
07-10-2010, 13:02
Напишите, пожалуйста, возможно ли реализовать нижеследующее? Если да, то, прошу помочь.
1) Есть файл D:\DP_MassStorage_wnt5_x86-32_101002.7z;
2) Нужно при помощи *.cmd файла определить имя файла D:\DP_MassStorage_wnt5_x86-32_101002.7z, т. е. DP_MassStorage_wnt5_x86-32_101002 и записать это имя, т. е. DP_MassStorage_wnt5_x86-32_101002 в переменную *.cmd файла, чтобы затем эту переменную, постоянно меняющуюся в зависимости от имени файла, использовать при создании архива.

Что-то вроде такого должно получиться:@ECHO OFF
SET NAZVANIYE_BEZ_.7z=DP_MassStorage_wnt5_x86-32_101002

ECHO Распаковка файла %SET NAZVANIYE_BEZ_.7z%.7z в папку D:\1.
"%PROGRAMFILES%\7-Zip\7z.exe" x "D:\%SET NAZVANIYE_BEZ_.7z%.7z" -o"D:\1"

ECHO Упаковка папки D:\1 в архив D:\%NAZVANIYE_BEZ_.7z%_(N591).7z
"%PROGRAMFILES%\7-Zip\7z.exe" a "D:\%NAZVANIYE_BEZ_.7z%_(N591).7z" "D:\1"где текст после знака равно (в моём примере: DP_MassStorage_wnt5_x86-32_101002) в строкеSET NAZVANIYE_BEZ_.7z=должен определяться автоматически, в зависимости от имени файла D:\DP_MassStorage_wnt5_x86-32_101002.7z, а не вписываться вручную, как у меня.
Спасибо.

gora
07-10-2010, 13:45
For %%i In ("D:\DP_MassStorage_wnt5_x86-32_101002.7z") Do Set NAZVANIYE_BEZ_.7z=%%~ni Только у Вас дальше ошибки, поправил:@ECHO OFF
For %%i In ("D:\DP_MassStorage_wnt5_x86-32_101002.7z") Do Set NAZVANIYE_BEZ_.7z=%%~ni

ECHO Распаковка файла %NAZVANIYE_BEZ_.7z%.7z в папку D:\1.
"%PROGRAMFILES%\7-Zip\7z.exe" x "D:\%NAZVANIYE_BEZ_.7z%.7z" -o"D:\1"

ECHO Упаковка папки D:\1 в архив D:\%NAZVANIYE_BEZ_.7z%_(N591).7z
"%PROGRAMFILES%\7-Zip\7z.exe" a "D:\%NAZVANIYE_BEZ_.7z%_(N591).7z" "D:\1"

SharkyEXE
14-03-2012, 00:16
Пожалуйста, поправьте этот код, чтобы работало. А работать должно:
1) определение имени файла без расширения и запись в переменную
2) соответственно, после рабочего пункта 1) должен работать весь кодSET 123=D:
SET 321=%123%\Zip
For %%i In ("%321%\DP_MassStorage_wnt5_x86-32_*.7z") Do Set FILENAME=%%~ni
IF NOT EXIST "%321%\%FILENAME%.7z" GOTO A

:A
ECHO Нету файла "%321%\%FILENAME%.7z" (без кавычек)
GOTO ENDСпасибо.

gora
14-03-2012, 10:44
SharkyEXE, так?@Echo Off
Set m123=e:
Set m321=%m123%\Temp\MSP
Set maska=DP_MassStorage_wnt5_x86-32_*.7z
For %%i In ("%m321%\%maska%") Do Set FILENAME=%%~ni
If Defined FILENAME (
Echo Найден файл "%m321%\%FILENAME%.7z" ^(без кавычек^)
) Else (
Echo Не найден файл по маске "%m321%\%maska%" ^(без кавычек^)
)
Pause>nul

SharkyEXE
14-03-2012, 14:53
SharkyEXE, так? »Да, спасибо.

DonQuixote
29-12-2016, 12:49
Добрый лень
я переименовываю группы файлов таким макаром
set LIN1=for /f "tokens=*" %%a in ('dir /b "%BINDIR%
set LIN2= do ren "%orgFILE%"
%LIN1%ForgeAmidst-*.jar"')%LIN2%"%Rnam%GUImap_%%a"то есть сам код вот...выше я просто его укоротил))
set Rnam=1_
for /f "tokens=*" %%a in ('dir /b "%BINDIR%ForgeAmidst-*.jar"') do ren "%orgFILE%" "%Rnam%GUImap_%%a"
....
...
....
for /f "tokens=*" %%a in ('dir /b "%BINDIR%FullThrottleNEI-*.jar"') do ren "%orgFILE%" "%Rnam%GUI_3_S_%%a"
для каждого файла пишу свою строчку...
мне нужно теперь после имени файла каждого добавлять -FAXV
что бы на выходе получился из ForgeAmidst-1.1.1.jar в 1_GUImap_ForgeAmidst-1.1.1-FAXV.jar
сечас получаеться 1_GUImap_ForgeAmidst-1.1.1.jar-FAXV что сами видите не гуд

нашёл удобный способ для себя в 1 строчку...именно 1 строчку надо
For %%i In ("%BINDIR%BetterAchievements-*.jar") Do (Set FILENAME=%%~ni&ren "%%i" "%Rnam%GUI_%FILENAME%-FA0V%poi1%")
но переменная FILENAME не работает в команде ren

megaloman
29-12-2016, 17:30
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_ не понимаю.

DonQuixote
29-12-2016, 22:49
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 что бы выводило в консоль имя файла или полный путь...
скажем выводила те файлы которые переименованы уже конечным именем и те файлы которые не были найден?

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

P.S. Для цитирования используйте тэг «quote».

megaloman
30-12-2016, 16:02
...маска файла всегда разная...я просто создаю новую строчку с нужным именем...
...Каждый из этих файлов надо переименовать...
Впереди имени файла и сзади имени файла (перед расширением) ... надо добавить ... всегда разное
... но мне надо бы в 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

DonQuixote
30-12-2016, 19:07
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"
для меня работает сечас замечательно,но хотелось бы в той же строке команды, добавить что то, что позволило бы выводить те файлы которые переименованы уже с конечным именем и те файлы которые не были найден в консоль.. не создавая дополнителную команду в новой строке

который потом можно смотреть текстовым редактором. »
Для 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
я таким образом группировал их.

megaloman
30-12-2016, 20:09
с виду код ваш не подойдёт.. А кто Вас в этом убедил?@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

DonQuixote
30-12-2016, 20:28
Цитата 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

с виду просто идеально!!!благодарю всех за помощью..щас буду делать поиск и замену по своему батнику..

Iska
30-12-2016, 20:32
знаю что
FOR /F "usebackq delims=" %%f IN (`dir /b "%BINDIR%\ForgeAmidst-*.jar" 2^>nul`) DO Ren "%BINDIR%\%%f" "%Rnam%INFO3_ADMIN_WD_%%~nf-FAXV%%~xf"
для меня работает сечас замечательно »
Да, я про этот принцип и писал.

но хотелось бы в той же строке команды, добавить что то, что позволило бы выводить те файлы которые переименованы уже с конечным именем … не создавая дополнителную команду в новой строке »
Чем Вас не устраивает отдельная строка? Так же куда нагляднее. Впрочем, если очень хотите, можно обойтись и одной (работоспособность не проверялась, демонстрируется только принцип):
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")

и те файлы которые не были найден в консоль.. »
Это какие?

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

DonQuixote
30-12-2016, 20:39
Цитата 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

всем спасибо всех с наступающим)))




© OSzone.net 2001-2012