Показать полную графическую версию : [решено] Усечение строки до указаной подстроки
Здравствуйте!
Задача звучит примерно так: нужно из обрезать строку к указанной подстроке. Выглядит так:
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=
В чём может быть проблема?
vogon_, во-первых, не используйте системные и пользовательские переменные в качестве рабочих:
set path=system/priv-app/SecSettings.apk=com.android.settings »
Во-вторых:
Ожидаемый результат - system/priv-app/, »
совершенно не ожидаемый. Ожидаемый:
system/priv-app/&rem .apk=com.android.settings
В чём может быть проблема? »
В «&».
Опишите, что потребно получить. А не как.
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%" можно это увидеть? Тогда непонятно: в чём задача?
Iska, ответ на первое замечание - спасибо, учту на будущее :yes:
На второе - ожидаемый результат тот, который я указал, не иначе. По-крайней мере, я ожидал такой результат.
На третье - так ведь указано. Объясню подробнее (я неясно выразился, прошу прощения) - нужно в строке path откинуть все символы после подстроки apkName с этой подстрокой включительно.
Ответ на мой вопрос дал Georgio, поэтому всё решено :rupor:
Georgio, спасибо, всё работает :)
Только в начале почему-то добавляется знак процента. А так всё супер! Благодарю)
megaloman, комментарием выше я написал, в чём задача (правда, она уже решена).
Спасибо за внимание, очень приятно, что так много отзывчивых людей! Удачи)
Ответ на мой вопрос дал 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
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%
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 та часть, которая после знака комментария, не будет учитываться.
Как бы там ни было, переменная имеет то значения, которое я хотел достать.
Спасибо за помощь)
Как бы там ни было, переменная имеет то значения, которое я хотел достать. »
Нет, Вы не правы! Переменная как раз имеет другое значение, а именно то что приведено у Iska E:\Песочница\0382>echo [system/priv-app/ & rem .apk=com.android.settings]
[system/priv-app/ »А строкой ниже приведена не переменная, а результат команды Echo с такой горе-переменной. Если она у Вас больше ни с какими командами не будет использоваться, то это полбеды, в противном случае содержимое переменной должно быть более легитимный и не должно использовать "фокусы" с & rem
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) отрабатывает корректно.
gora, да, спасибо, я с Вами полностью согласен!
Я не силён в скриптах, просто нужно было кое-что проверить.
А переменная действительно только выводит нужный результат, но не содержит.
Извините за неточную формулировку задачи.
Iska, реально Вам спасибо, я наконец-то понял, к чему Вы ведёте, просто я туплю.
Мне больше нужно было увидеть результат, хотя спасибо за Ваши замечания, обязательно воспользуюсь Вашими советами.
Ещё раз благодарю :bow:
Следует воспользоваться рецептом от коллеги 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, спасибо, получилось)
Правда, конкретно в моем примере знак "=" в строке немного все усложнил, но я разобрался и всё сделал, как надо.
Благодаря Вам. Спасибо!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.