PDA

Показать полную графическую версию : [решено] рубка строки “c:\example\..\example.zip\..\ example.doc” в “c:\example\.\example.zip


akrav
14-01-2008, 12:50
Есть такая переменная = “c:\example\...\example.zip\...\ example.doc” Нужно обрубить строку при первом появлении имени архивного файла, имя которого может быть производным.

XCodeR
14-01-2008, 18:24
akrav, язык какой?

akrav
14-01-2008, 22:50
желательно стандартными возможностями пакетных файлов 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

akrav
16-01-2008, 11:03
Спасибо большое! Все работает замечательно, раньше я использовал call только для вызова процедур, совсем забыв про возможности windows nt. Остался только один вопрос по этой теме. Что означает звездочка(*) в выражении:@set v="eol=; tokens=%1* delims=\" »

akrav
29-01-2008, 15:42
ничего не понимаю, но наличие пробелов в исходной строке работают таке как и .zip. Т.е. в случае "c:\program files\expl\test.zip\test.doc" результат будет "c:\program", а не "c:\program files\expl\test.zip"

akrav
30-01-2008, 16:52
Появилась идея, а что если после .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\...

amel27
02-02-2008, 15:59
хм, имхо можно короче (если я правильно понял задачу):@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. Если в имени отсутствует символ "!" код будет еще в два раза короче.

akrav
04-02-2008, 21:02
Уважаемый, hasherfrog! Это действительно работает. Только вот если нужно будет передать программе несколько параметров, как быть?

akrav
05-02-2008, 09:29
amel27, не могли бы Вы пояснить как это все работает?

amel27
05-02-2008, 11:29
как это все работает? »
параметры строки загоняем в переменные@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:/=!%

amel27
08-02-2008, 10:28
с подачи 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