Показать полную графическую версию : [решено] рубка строки “c:\example\..\example.zip\..\ example.doc” в “c:\example\.\example.zip
Есть такая переменная = “c:\example\...\example.zip\...\ example.doc” Нужно обрубить строку при первом появлении имени архивного файла, имя которого может быть производным.
желательно стандартными возможностями пакетных файлов win xp
hasherfrog
15-01-2008, 14:43
@if "%1"=="" goto usage
@set filename=%1
@set findpath=
@set ok=
@goto start
:sub3
@if "%findpath%"=="" goto first
@set findpath=%findpath%\%1
@goto next
:first
@set findpath=%1
:next
@echo %1 | find ".zip" >nul
@if "%errorlevel%"=="0" goto fook
@goto :EOF
:fook
@set ok=ok
@goto :EOF
:sub2
@FOR /F %1 %%i in ("%filename%") do @call :sub3 %%i
@goto :EOF
:sub
@if "%ok%"=="ok" @goto :EOF
@set v="eol=; tokens=%1* delims=\"
@call :sub2 %v%
@goto :EOF
:start
@FOR /L %%z IN (1,1,10) DO @call :sub %%z
@echo %findpath%
@goto :EOF
:usage
@echo Usage: stripname.bat filename\...\filename.zip\filename\...
Пример использования:
C:\Temp>stripname c:\123123.123123\123.zip\\123.12312.3\123\123\123.doc
c:\123123.123123\123.zip
Спасибо большое! Все работает замечательно, раньше я использовал call только для вызова процедур, совсем забыв про возможности windows nt. Остался только один вопрос по этой теме. Что означает звездочка(*) в выражении:@set v="eol=; tokens=%1* delims=\" »
ничего не понимаю, но наличие пробелов в исходной строке работают таке как и .zip. Т.е. в случае "c:\program files\expl\test.zip\test.doc" результат будет "c:\program", а не "c:\program files\expl\test.zip"
Появилась идея, а что если после .zip/ вставить стоп символ или комбинацию, а потом эту строку разбить в цикле разделителем = стоп символу. Но пока это все что-то не фурычит…
hasherfrog
31-01-2008, 13:13
Используйте такой код:
@rem @set filename=c:\qweqweqwe\qweqweqwe\qweqweqwe\qweqwe.zip\fsdfsd\qweqweqw\r.doc
@if "%*"=="" goto usage
@set filename=%*
@set findpath=
@set ok=
@goto start
:sub3
@if "%findpath%"=="" goto first
@set findpath=%findpath%\%*
@goto next
:first
@set findpath=%*
:next
@echo %* | find ".zip" >nul
@if "%errorlevel%"=="0" goto fook
@goto :EOF
:fook
@set ok=ok
@goto :EOF
:sub2
@FOR /F %1 %%i in ("%filename%") do @call :sub3 %%i
@goto :EOF
:sub
@if "%ok%"=="ok" @goto :EOF
@set v="eol=; tokens=%1* delims=\"
@call :sub2 %v%
@goto :EOF
:start
@FOR /L %%z IN (1,1,20) DO @call :sub %%z
@if "%ok%"=="ok" @goto heyho
@echo Pattern ".zip" is not found.
@goto :EOF
:heyho
@echo %findpath%
@goto :EOF
:usage
@echo Usage: stripname.bat filename\...\filename.zip\filename\...
хм, имхо можно короче (если я правильно понял задачу):@Set FilePart=%~1
@Set FileName=%~2
@Set FilePart=%FilePart:!=/%
@Set FileName=%FileName:!=/%
@SetLocal EnableDelayedExpansion
@Set FileTrim=!FileName:*%FilePart%=!
@Set FileLeft=!FileName:%FileTrim%=!
@SetLocal DisableDelayedExpansion
@Echo %FileLeft:/=!%пример:script.cmd ".zip" "c:\qweqweqwe\qweqweqwe\qweqweqwe\qweqwe.zip\fsdfsd\qweqweqw\r.doc"
P.S. Если в имени отсутствует символ "!" код будет еще в два раза короче.
Уважаемый, hasherfrog! Это действительно работает. Только вот если нужно будет передать программе несколько параметров, как быть?
amel27, не могли бы Вы пояснить как это все работает?
как это все работает? »
параметры строки загоняем в переменные@Set FilePart=%~1
@Set FileName=%~2замена вхождений "!" на "/"@Set FilePart=%FilePart:!=/%
@Set FileName=%FileName:!=/%включаем расширенную обработку для "!"@SetLocal EnableDelayedExpansionв исходной строке удаляем все вплоть до первого вхождения ".zip", остаток сохраняем в переменной@Set FileTrim=!FileName:*%FilePart%=!удаляем полученный остаток из исходной строки - получаем то, что нужно@Set FileLeft=!FileName:%FileTrim%=!отключаем расширенную обработку для "!"@SetLocal DisableDelayedExpansionвозвращаем на место "!"@Echo %FileLeft:/=!%
с подачи Petya V4sechkin нашел более короткий вариант без всяких преобразований:@echo off
Set FilePart=%~1
Set FileName=%~2
Call Set FileTrim=%%FileName:*%FilePart%=%%
Call Set FileLeft=%%FileName:%FileTrim%=%%
Echo %FileLeft%
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2024, Jelsoft Enterprises Ltd.