Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] рубка строки “c:\example\..\example.zip\..\ example.doc” в “c:\example\.\example.zip (http://forum.oszone.net/showthread.php?t=98075)

akrav 14-01-2008 12:50 716382

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

XCodeR 14-01-2008 18:24 716728

akrav, язык какой?

akrav 14-01-2008 22:50 716947

желательно стандартными возможностями пакетных файлов win xp

hasherfrog 15-01-2008 14:43 717409

Код:

@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 718173

Спасибо большое! Все работает замечательно, раньше я использовал call только для вызова процедур, совсем забыв про возможности windows nt. Остался только один вопрос по этой теме. Что означает звездочка(*) в выражении:
Цитата:

Цитата hasherfrog
@set v="eol=; tokens=%1* delims=\" »


akrav 29-01-2008 15:42 728211

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

akrav 30-01-2008 16:52 729146

Появилась идея, а что если после .zip/ вставить стоп символ или комбинацию, а потом эту строку разбить в цикле разделителем = стоп символу. Но пока это все что-то не фурычит…

hasherfrog 31-01-2008 13:13 729806

Используйте такой код:
Код:

@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 731447

хм, имхо можно короче (если я правильно понял задачу):
Код:

@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 732888

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

akrav 05-02-2008 09:29 733204

amel27, не могли бы Вы пояснить как это все работает?

amel27 05-02-2008 11:29 733272

Цитата:

Цитата akrav
как это все работает? »

параметры строки загоняем в переменные
Код:

@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 735605

с подачи Petya V4sechkin нашел более короткий вариант без всяких преобразований:
Код:

@echo off

Set FilePart=%~1
Set FileName=%~2

Call Set FileTrim=%%FileName:*%FilePart%=%%
Call Set FileLeft=%%FileName:%FileTrim%=%%

Echo %FileLeft%



Время: 12:10.

Время: 12:10.
© OSzone.net 2001-