Вопрос или проблема
С batch-скриптом для установки переменной из For и Tokens и удаления первого символа:
for /f "tokens=1,2,3,4,5,6,7,8" %A in (
'net user %username% /domain ^|
find "Global Group memberships"'
)
do set groupname=%D:~1%
Имя группы похоже на *Groupname, и мне нужно удалить символ *.
Я проверяю переменную с помощью echo %groupname%
, и вывод такой: *Groupname:~1%
Как я могу получить желаемый результат?
Не совсем уверен, какую именно информацию вы пытаетесь собрать и изменить, но я поработал с этим и этот код ниже может помочь, или хотя бы дать вам некоторые идеи.
:: Информация здесь — Это только для информации и может быть удалено.
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS
:: Используя gpresult и выводя информацию в txt
gpresult /user %username% /v >"%temp%\OSInfo.txt"
:: Чтение всех Token в .txt
for /F "usebackq tokens=*" %%A in ("%temp%\OSInfo.txt") do (
Set "TmpVar=%%A" &echo Reading: %%A
:: Удалить 1-й символ переменной
Set "TmpVar=!TmpVar:~1!" &echo Rem1st: !TmpVar! &echo.
:: Найти группы безопасности
echo %%A | findstr /I /R /C:".*security groups.*" >nul
:: Если err=0, значит найдено. Если err=1, не найдено.
if "!errorlevel!" == "0" (
:: Установить var, чтобы знать, что группы найдены
Set "_PastGroups=Yes"
)
:: Найти конец групп -- привилегии безопасности
echo %%A | findstr /I /R /C:".*security privileges.*" >nul
:: Если err=0, значит найдено. Если err=1, не найдено.
if "!errorlevel!" == "0" (
:: Очистить Var, чтобы знать, что прошел группы
Set "_PastGroups="
)
:: Если _PastGroups = да, выводить все в groups.txt
if "!_PastGroups!" == "Yes" echo %%A >>"%temp%\Groups.txt"
)
echo.&echo Reading Groups.txt.. &echo.
for /F "usebackq tokens=*" %%A in ("%temp%\Groups.txt") do (
echo %%A
)
pause
Приведенный выше код собирает информацию с помощью gpresult и выводит ее в файл. Затем он считывает файлы, используя for и findstr, чтобы найти группы, и при обнаружении выводит информацию о группах в temp\Groups.txt, после прохождения групп очищает переменную, чтобы обозначить, что группы пройдены, и в конце считывает groups.txt и выводит результаты в окно .bat, я собирался просто использовать команду type для вывода в окно, но решил, что цикл for может быть более полезным.
Надеюсь, это поможет 🙂
Ответ или решение
Чтобы решить задачу удаления первого символа из переменной, полученной в Batch скрипте, после использования команды FOR и TOKENS, следует более тщательно проанализировать процесс обработки строк. Пример, описанный в вопросе, подразумевает использование командной оболочки Windows для работы с выходными данными команды net user
, но по какой-то причине манипуляции со строкой не работают должным образом. Попробуем детально объяснить, как этого можно добиться.
Теория
В Batch-скриптах для манипулирования строковыми значениями используются встроенные средства командной строки. В нашем случае мы применяем:
- FOR /F: Команда, предназначенная для чтения вывода другой команды или содержимого файла и разделения его на токены по заданному разделителю.
- Переменные окружения: Внутри цикла FOR переменные, такие как
%A
,%B
,%C
и так далее, используются для обращения к токенам текущей строки. - Срез строк: В Batch-скриптах можно использовать синтаксис
%variable:~offset,length%
для получения подстроки.
Пример
Исходный код:
for /f "tokens=1,2,3,4,5,6,7,8" %A in (
'net user %username% /domain ^| find "Global Group memberships"'
) do set groupname=%D:~1%
В этом примере ключевая ошибка заключается в попытке удалить первый символ без использования DELAYEDEXPANSION, поскольку в Batch-скриптах подстановка переменных происходит в момент их оценки. Чтобы добиться нужного результата, разберем, как обойти ограничения.
Применение
Для корректного выполнения задачи необходимо следующее:
- Использовать задержанную подстановку:
setlocal enabledelayedexpansion
позволяет выполнять подстановку переменных в момент их использования, а не задания. - Использовать правильный синтаксис обработки строк.
Исправленный код:
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2,3,4,5,6,7,8" %%A in (
'net user %username% /domain ^| find "Global Group memberships"'
) do (
set "groupname=%%D"
set "groupname=!groupname:~1!"
echo !groupname!
)
endlocal
Пояснения:
- Переменная
groupname
сначала сохраняется как%%D
, получая необработанную строку. - Задержанная подстановка
!groupname:~1!
используется для удаления первого символа. - Использование
%%
вместо%
в коде необходимо для запуска из файла скрипта (.bat), в отличие от введения напрямую в командную строку.
Заключение
Используя подход с setlocal enabledelayedexpansion
, удается управлять подстановкой переменных даже после выполнения изменения их значений. Это критически важно в Batch-скриптах, когда необходимо манипулировать строковыми значениями или результирующими данными других команд.
В контексте обработки строк в Batch скриптинге, данный подход позволяет более точно управлять результатами обработки данных, минимизируя ошибки и повышая гибкость скриптов. С подобным использованием командных возможностей, можно расширять функционал обработки не только встроенными командами, но и сторонними инструментами, такими как findstr и другими.
Таким образом, правильное понимание и применение механизма задержанной подстановки является ключом к решению задачи удаления первого символа в Batch скрипте на платформе Windows.