Пакетный файл: длина строки в цикле - PullRequest
2 голосов
/ 22 марта 2020

Я пытаюсь распечатать отформатированную строку, для которой мне нужно найти длину строки. Я просмотрел различные методы на этом сайте, но ни один из них, похоже, не работает, когда вызывается для работы в al oop.

Я пытаюсь настроить код Элиаса Бачалани, который распечатывает все сохраненные Windows Wifi пароли. Данный раздел приведен ниже.

   call :get-profiles r

    :: For each profile, try to get the password
    :main-next-profile
        for /f "tokens=1* delims=," %%a in ("%r%") do (
            call :get-profile-key "%%a" key
            echo WiFi: [%%a] Password: [!key!]

            set r=%%b
        )
        if "%r%" NEQ "" goto main-next-profile

    pause

Я подумал, что это будет так же просто, как добавить внутренний l oop для подсчета количества символов в переменной %% a:

    call :get-profiles r

    REM For each profile, try to get the password
    :main-next-profile
        for /f "tokens=1* delims=," %%a in ("%r%") do (
            call :get-profile-key "%%a" key
            echo WiFi: %%a Password: !key!

            set len=0
            set wifiname=%%a

            :getlen
                call set substring=%%wifiname:~%len%,1%%
                set /a len+=1
                echo Len:!len! A:%%a WFN:!wifiname! SS:!substring!
                if "!substring!" NEQ "" goto getlen

            pause

            set r=%%b
        )
        if "%r%" NEQ "" goto main-next-profile

    pause

Используя приведенный выше код, я получаю вывод, как показано:

    WiFi: NOC-Guest Password:xyz
    Len:1 A:NOC-Guest WFN:NOC-Guest SS:N
    Len:2 A:%a WFN:NOC-Guest SS:O
    Len:3 A:%a WFN:NOC-Guest SS:C
    Len:4 A:%a WFN:NOC-Guest SS:-
    Len:5 A:%a WFN:NOC-Guest SS:G
    Len:6 A:%a WFN:NOC-Guest SS:u
    Len:7 A:%a WFN:NOC-Guest SS:e
    Len:8 A:%a WFN:NOC-Guest SS:s
    Len:9 A:%a WFN:NOC-Guest SS:t
    Len:10 A:%a WFN:NOC-Guest SS:
    Press any key to continue . . .
    WiFi: %b Password:
    Len:1 A:%b WFN:%b SS:
    Press any key to continue . . .
    Press any key to continue . . .

Похоже, переменная %% a заполняется правильно на первой итерации этой internal l oop, но затем теряет свой путь на второй итерации. Если я выполню код без внутреннего l oop (и только команды echo WiFi: %%a Password: !key!), список Wi-Fi будет напечатан отлично.

Что я делаю неправильно? Я в некоторой степени осведомлен о enabledelayedexpansion, но это больше похоже на проблему непостоянных переменных в подпрограммах.

Доступен полный оригинальный код здесь

...