Есть ли способ преобразовать строки из смешанного в верхний регистр в пакетном сценарии Windows?
Я пишу пакетный файл для создания определенных объектов и предоставления доступа группам пользователей к ним. То есть я должен ввести такие команды, как
cas caslibs create path --name CAS_HRCOCKPIT --path /sas/data/projects/HRCOCKPIT /
cas caslibs add-control --name CAS_HRCOCKPIT --group GSSASELA-DEVHRCockpitUsers --grant read
cas caslibs add-control --name CAS_HRCOCKPIT --group GSSASELA-DEVHRCockpitAdmins --grant modify
Объекты должны быть в верхнем регистре, а группы пользователей - нет. Как преобразовать строку типа Cockpit
в HRCOCKPIT
?
Я не уверен, что понимаю ваш вопрос на 100%.
Вы, кажется, спрашиваете, как преобразовать (значение) переменной
в пакетном файле Windows от смешанного до прописного регистра.
Если да, то вопрос суперпользовать Как сделать прописные все файлы и папки
в каталоге? , seçkin bilgiç, содержит ответ.
Предположим, что переменная вызывается obj
(т.е. вы сделали set obj=Cockpit
), do
setlocal enableDelayedExpansion
︙
for %%A in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
set "obj=!obj:%%A=%%A!"
)
При этом используется синтаксис %:old=new%
для подстановки в значении переменной.
Например, если мы задам animal=cow
, то %animal:ow=at%
даст cat
.
Полезной особенностью этого является то, что соответствие для старой строки
не чувствительна к регистру, но замена сохраняет регистр;
таким образом, %animal:OW=AT%
дает cAT
.
Аналогично, если obj=Cockpit
, то %obj:T=T%
дает CockpiT
,
и поэтому мы можем использовать это для замены буквы
с прописной версией самого себя.
Мы перебираем алфавит, получая эффект
set "obj=%obj:A=A%"
set "obj=%obj:B=B%"
set "obj=%obj:C=C%"
︙
без необходимости делать все 26 операторов.
Но переменные ведут себя странно в циклах в пакетных файлах.
Вот почему у нас есть setlocal enableDelayedExpansion
,
и почему мы используем !...!
вместо %...%
в назначении в цикле.