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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Усечение строки до указаной подстроки (http://forum.oszone.net/showthread.php?t=284813)

vogon_ 09-07-2014 17:48 2374283

Усечение строки до указаной подстроки
 
Здравствуйте!

Задача звучит примерно так: нужно из обрезать строку к указанной подстроке. Выглядит так:

Код:

set apkName=SecSettings
set path=system/priv-app/SecSettings.apk=com.android.settings

call set path=%%path:%apkName%=&rem %%
echo %path%

Почему-то не работает. Ожидаемый результат - system/priv-app/, а выходит %%path:SecSettings=
В чём может быть проблема?

Iska 09-07-2014 18:49 2374309

vogon_, во-первых, не используйте системные и пользовательские переменные в качестве рабочих:
Цитата:

Цитата vogon_
Код:

set path=system/priv-app/SecSettings.apk=com.android.settings
»

Во-вторых:
Цитата:

Цитата vogon_
Ожидаемый результат - system/priv-app/, »

совершенно не ожидаемый. Ожидаемый:
Код:

system/priv-app/&rem .apk=com.android.settings
Цитата:

Цитата vogon_
В чём может быть проблема? »

В «&».

Опишите, что потребно получить. А не как.

Georgio 09-07-2014 18:58 2374315

Код:

set apkName=SecSettings
set path=system/priv-app/SecSettings.apk=com.android.settings

call set "path=%%path:%apkName%=&rem %%"
echo %path%


megaloman 09-07-2014 22:04 2374410

Georgio, Красивая конструкция, но, Насколько я понял, обрезать строку не получилось, результат - обрезанная выдача искаженной исходной строки? Если сделать echo "%path%" можно это увидеть? Тогда непонятно: в чём задача?

vogon_ 09-07-2014 23:13 2374445

Iska, ответ на первое замечание - спасибо, учту на будущее :yes:

На второе - ожидаемый результат тот, который я указал, не иначе. По-крайней мере, я ожидал такой результат.

На третье - так ведь указано. Объясню подробнее (я неясно выразился, прошу прощения) - нужно в строке path откинуть все символы после подстроки apkName с этой подстрокой включительно.

Ответ на мой вопрос дал Georgio, поэтому всё решено :rupor:

Georgio, спасибо, всё работает :)
Только в начале почему-то добавляется знак процента. А так всё супер! Благодарю)

megaloman, комментарием выше я написал, в чём задача (правда, она уже решена).
Спасибо за внимание, очень приятно, что так много отзывчивых людей! Удачи)

Iska 09-07-2014 23:53 2374473

Цитата:

Цитата vogon_
Ответ на мой вопрос дал Georgio, поэтому всё решено
Georgio, спасибо, всё работает »

Отнюдь:
Код:

set apkName=SecSettings
set path=system/priv-app/SecSettings.apk=com.android.settings

call set "path=%%path:%apkName%=&rem %%"
echo [%path%]

Цитата:

Код:

E:\Песочница\0382>0007.cmd

E:\Песочница\0382>set apkName=SecSettings

E:\Песочница\0382>set path=system/priv-app/SecSettings.apk=com.android.settings

E:\Песочница\0382>call set "path=%path:SecSettings=&rem %"

E:\Песочница\0382>echo [system/priv-app/  & rem .apk=com.android.settings]
[system/priv-app/


Переменная окружения содержит всю строку «system/priv-app/&rem .apk=com.android.settings». В этом легко убедиться, хотя бы исполнив «set path». Просто командный процессор при выводе переменной окружения по «echo» рассматривает «&» как специальный символ.

Цитата:

Цитата vogon_
нужно в строке path откинуть все символы после подстроки apkName с этой подстрокой включительно. »

Следует воспользоваться рецептом от коллеги gora:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sVar=bla-bla-bla-substring-bla-bla-bla
set sSubString=substring

set sLastPartVar=!sVar:*%sSubString%=!
set sResultVar=!sVar:%sLastPartVar%=!

echo [%sResultVar%]

endlocal
exit /b 0


Georgio 10-07-2014 07:23 2374535

Код:

set apkName=SecSettings
set path=system/priv-app/SecSettings.apk=com.android.settings

call set "path=%%path:%apkName%=&rem %%"
for /f "delims=" %%i in ('call echo %%path%%') do set path=%%i
echo %path%


vogon_ 10-07-2014 09:33 2374568

Iska, но ведь у меня всё работает:

Код:

C:\>set apkName=SecSettings

C:\>set path=system/priv-app/SecSettings.apk=com.android.settings

C:\>call set "path=%path:%apkName%=&rem %"

C:\>echo %path%
system/priv-app/

Это тот результат, который я ожидал и который мне очень нужен.
В чём проблема? Дело в том, что после "&rem " всё делается комментарием, в этом фишка такой команды) То есть при использовании переменной path та часть, которая после знака комментария, не будет учитываться.

Как бы там ни было, переменная имеет то значения, которое я хотел достать.
Спасибо за помощь)

gora 10-07-2014 11:09 2374597

Цитата:

Цитата vogon_
Как бы там ни было, переменная имеет то значения, которое я хотел достать. »

Нет, Вы не правы! Переменная как раз имеет другое значение, а именно то что приведено у Iska
Цитата:

Цитата Iska
E:\Песочница\0382>echo [system/priv-app/ & rem .apk=com.android.settings]
[system/priv-app/ »

А строкой ниже приведена не переменная, а результат команды Echo с такой горе-переменной. Если она у Вас больше ни с какими командами не будет использоваться, то это полбеды, в противном случае содержимое переменной должно быть более легитимный и не должно использовать "фокусы" с & rem

Iska 10-07-2014 11:17 2374600

Цитата:

Цитата vogon_
Iska, но ведь у меня всё работает: »

Не верю:
Цитата:

Код:

E:\Песочница\0382>0010.cmd

E:\Песочница\0382>set apkName=SecSettings

E:\Песочница\0382>set path=system/priv-app/SecSettings.apk=com.android.settings

E:\Песочница\0382>call set "path=%path:SecSettings=&rem %"

E:\Песочница\0382>echo [system/priv-app/  & rem .apk=com.android.settings]
[system/priv-app/



Покажите мне вывод того же кода, но с добавлением «[]» и «set path»:
Код:

set apkName=SecSettings
set path=system/priv-app/SecSettings.apk=com.android.settings

call set "path=%%path:%apkName%=&rem %%"
echo [%path%]
set path

Цитата:

Цитата vogon_
В чём проблема? Дело в том, что после "&rem " всё делается комментарием, в этом фишка такой команды) То есть при использовании переменной path та часть, которая после знака комментария, не будет учитываться. »

Проблема в том, что переменная окружения содержит совсем не то, что Вы видите. И эта, невидимая Вам, часть учитывается.

Georgio, код из #7 отрабатывает корректно.

vogon_ 10-07-2014 11:20 2374601

gora, да, спасибо, я с Вами полностью согласен!

Я не силён в скриптах, просто нужно было кое-что проверить.

А переменная действительно только выводит нужный результат, но не содержит.

Извините за неточную формулировку задачи.

Iska, реально Вам спасибо, я наконец-то понял, к чему Вы ведёте, просто я туплю.

Мне больше нужно было увидеть результат, хотя спасибо за Ваши замечания, обязательно воспользуюсь Вашими советами.

Ещё раз благодарю :bow:

vogon_ 10-07-2014 13:12 2374667

Цитата:

Цитата Iska
Следует воспользоваться рецептом от коллеги gora: »

Решил испытать код в этом посте, вот что получилось:

Код:

C:\>setlocal enableextensions enabledelayedexpansion

C:\>set sVar=package:/system/priv-app/SecSettings.apk=com.android.settings

C:\>set sSubString=SecSettings

C:\>set sLastPartVar=!sVar:*%sSubString%=!

C:\>set sResultVar=!sVar:%sLastPartVar%=!

C:\>echo [%sResultVar%]
[!sVar:!sVar:*SecSettings=!=!]

Что-то здесь не так...

Как я писал раньше, мне нужно в sResultVar иметь значение system/priv-app/

Iska 10-07-2014 14:49 2374710

Цитата:

Цитата vogon_
Что-то здесь не так... »

Испытывайте код пакетным файлом, целиком, не выполнением отдельных строк в командной строке.

vogon_ 11-07-2014 09:09 2375052

Iska, спасибо, получилось)

Правда, конкретно в моем примере знак "=" в строке немного все усложнил, но я разобрался и всё сделал, как надо.

Благодаря Вам. Спасибо!


Время: 23:00.

Время: 23:00.
© OSzone.net 2001-2025