Как удалить первый символ переменной с помощью For и Tokens в пакетном скрипте?

Вопрос или проблема

С 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-скриптах подстановка переменных происходит в момент их оценки. Чтобы добиться нужного результата, разберем, как обойти ограничения.

Применение

Для корректного выполнения задачи необходимо следующее:

  1. Использовать задержанную подстановку: setlocal enabledelayedexpansion позволяет выполнять подстановку переменных в момент их использования, а не задания.
  2. Использовать правильный синтаксис обработки строк.

Исправленный код:

@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.

Оцените материал
Добавить комментарий

Капча загружается...