Batch / cmd - подпрограмма не «возвращает» массив через параметр - PullRequest
0 голосов
/ 20 мая 2018

В следующем скрипте я хочу передать строку через переменную и имя переменной для массива, который должен содержать подстроки в подпрограмме.

Подпрограмма помещает подстроки переданной строки в массив / список, которыйзатем должен получить «возвращение», установив его в качестве значения 2. переданного параметра.

@ECHO OFF
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
    SET testString=Hello World

    REM Pass testString and substrings to subroutine
    CALL :get_substrings testString substrings

    REM For testing. Echo substrings. DOESN'T WORK. substrings is empty!
    FOR /L %%s IN (0,1,2) DO (
        ECHO !substrings[%%s]!
    )
ENDLOCAL

EXIT /B 0

:get_substrings
    SETLOCAL ENABLEDELAYEDEXPANSION

    SET "string=!%~1!"

    REM Alternative approach: Make a connection to %2 rightaway
    REM SET "substrings=!%~2!"

    REM Process string: Put substrings into indexed array. This works as expected!
    FOR /L %%s IN (0,1,2) DO (
        SET substrings[%%s]=!string:~0,5!
        SET string=!string:~5!
    )

    REM For testing. Echo the substrings. Works as expected!
    FOR /L %%s IN (0,1,2) DO (
        ECHO !substrings[%%s]! 
    )

    REM For alternative approach
    REM ENDLOCAL

    REM End the local the set 2.param = substringsArray
    ENDLOCAL & SET %2=%substrings%
EXIT /B 0

Обработка строки путем создания массива с подстроками в подпрограмме работает, как и ожидалось.Но установка значения параметров 2. и сохранение значения после подпрограммы не работает ...

Примечания: Обработка строки - просто пустышка.Реальный процесс немного отличается, но ядро ​​с массивом подстрок одинаково.Сценарий исполняется сразу.

Итак, как мне вернуть подстроки значений?

Ответы [ 3 ]

0 голосов
/ 21 мая 2018

Это делает то, что вы хотите:

@ECHO OFF
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
    SET testString=Hello World

    REM Pass testString and substrings to subroutine
    CALL :get_substrings testString substrings

    REM For testing. Echo substrings.
    FOR /L %%s IN (0,1,2) DO (
        ECHO !substrings[%%s]!
    )
ENDLOCAL

EXIT /B 0

:get_substrings
    SETLOCAL ENABLEDELAYEDEXPANSION

    SET "string=!%~1!"

    REM Process string: Put substrings into indexed array. This works as expected!
    FOR /L %%s IN (0,1,2) DO (
        SET substrings[%%s]=!string:~0,5!
        SET string=!string:~5!
    )

    REM For testing. Echo the substrings. Works as expected!
    FOR /L %%s IN (0,1,2) DO (
        ECHO !substrings[%%s]! 
    )

    REM End the local the set 2.param = substringsArray
    set SubEnviron=1
    for /F "tokens=2* delims=[]=" %%a in ('set substrings[') do (
        if defined SubEnviron ENDLOCAL
        set "%2[%%a]=%%b"
    )

EXIT /B 0
0 голосов
/ 21 мая 2018

Да, я полностью понимаю, что вы не собираетесь менять этот код на PowerShell.Но, возможно, в следующий раз стоит подумать, насколько это легко.get_substrings является лямбда-выражением.

PS C:\src\t\selarr> type .\lamb002.ps1
$teststring = 'hello cruel world'

$get_substrings = { param($t) foreach ($s in $t.split()) { $s.Substring(0,4) } }

$a = & $get_substrings $teststring
$a.length
$a[0]
$a[1]
$a[2]

PS C:\src\t\selarr> .\lamb002.ps1
3
hell
crue
worl
0 голосов
/ 21 мая 2018

Я не смог понять, как вы подсчитываете количество символов, поэтому вот, как я, вероятно, сделал бы это:

@Echo Off
SetLocal EnableDelayedExpansion
Set "TestString=Hello World"

For /F "Delims==" %%A In ('Set SubString[ 2^>Nul') Do Set "%%A="
Set "i=1"
Set "SubString[%i%]=%TestString: ="&Set/A i+=1&Set "SubString[!i!]=%"

Set SubString[
Pause

Пример вывода:

SubString[1]=Hello
SubString[2]=World
Press any key to continue . . .

Для целей тестированиявам, вероятно, не нужен цикл For, , его цель - убедиться, что нет переменных, имя которых начинается с SubString[

Редактировать

Здесь используются три параметра:

  1. Строка для вырезания
    %string%
  2. Число длины каждой подстроки
    %chrnum%
  3. Параметр подстроки
    %strvar%

@Echo Off
SetLocal EnableDelayedExpansion

Set "string=montuewedthufrisatsun"
Set "chrnum=3"
Set "strvar=substring"

Set "i=1"
Set "_=%string%"

:Loop
Set "!strvar![%i%]=!_:~,%chrnum%!"
If "!_:~%chrnum%!"=="" GoTo Write
Set "_=!_:~%chrnum%!"
Set /A i+=1
GoTo Loop

:Write
Set !strvar![ 2>Nul
Pause
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...