Войти

Показать полную графическую версию : [решено] Усечение строки до указаной подстроки


vogon_
09-07-2014, 17:48
Здравствуйте!

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


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
vogon_, во-первых, не используйте системные и пользовательские переменные в качестве рабочих:
set path=system/priv-app/SecSettings.apk=com.android.settings »

Во-вторых:
Ожидаемый результат - system/priv-app/, »
совершенно не ожидаемый. Ожидаемый:
system/priv-app/&rem .apk=com.android.settings

В чём может быть проблема? »
В «&».

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

Georgio
09-07-2014, 18:58
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
Georgio, Красивая конструкция, но, Насколько я понял, обрезать строку не получилось, результат - обрезанная выдача искаженной исходной строки? Если сделать echo "%path%" можно это увидеть? Тогда непонятно: в чём задача?

vogon_
09-07-2014, 23:13
Iska, ответ на первое замечание - спасибо, учту на будущее :yes:

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

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

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

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

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

Iska
09-07-2014, 23:53
Ответ на мой вопрос дал 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» рассматривает «&» как специальный символ.

нужно в строке 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
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
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
Как бы там ни было, переменная имеет то значения, которое я хотел достать. »
Нет, Вы не правы! Переменная как раз имеет другое значение, а именно то что приведено у Iska E:\Песочница\0382>echo [system/priv-app/ & rem .apk=com.android.settings]
[system/priv-app/ »А строкой ниже приведена не переменная, а результат команды Echo с такой горе-переменной. Если она у Вас больше ни с какими командами не будет использоваться, то это полбеды, в противном случае содержимое переменной должно быть более легитимный и не должно использовать "фокусы" с & rem

Iska
10-07-2014, 11:17
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/
Покажите мне вывод того же кода (http://forum.oszone.net/post-2374315.html#post2374315), но с добавлением «[]» и «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

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

Georgio, код из #7 (http://forum.oszone.net/post-2374535-7.html) отрабатывает корректно.

vogon_
10-07-2014, 11:20
gora, да, спасибо, я с Вами полностью согласен!

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

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

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

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

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

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

vogon_
10-07-2014, 13:12
Следует воспользоваться рецептом от коллеги 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
Что-то здесь не так... »
Испытывайте код пакетным файлом, целиком, не выполнением отдельных строк в командной строке.

vogon_
11-07-2014, 09:09
Iska, спасибо, получилось)

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

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




© OSzone.net 2001-2012