Расширение переменной команды findstr в пути для пакетного сценария l oop (windows, пакетный сценарий) - PullRequest
2 голосов
/ 04 марта 2020
echo off
set "MasterFolder=C:\Users\Development\test_folder"
SetLocal EnableDelayedexpansion
@FOR /f "delims=" %%f IN ('dir /b /s "%MasterFolder%\*.txt"') DO (
    set /a "idx+=1"
    set "FileName[!idx!]=%%~nxf"
    set "FilePath[!idx!]=%%~dpFf"
)

for /L %%i in (1,1,%idx%) do (
    echo [%%i] "!FileName[%%i]!"

    set "loc=%MasterFolder%\!FileName[%%i]!"
    echo path: %MasterFolder%\!FileName[%%i]!
    echo loc: !loc!
    FOR /F "tokens=1,2 delims=:" %%1 in ('findstr /o "^" "%MasterFolder%\test_1.txt"') DO (
        set new_pos=%%1
        echo new_pos !new_pos!
    )
)

Приведенный выше код работает, однако следующие коды не работают.

echo off
... 
FOR /F "tokens=1,2 delims=:" %%1 in ('findstr /o "^" "%MasterFolder%\!FileName[%%i]!"') DO (
        set new_pos=%%1
        echo new_pos !new_pos!
    )
)
echo off
...
    FOR /F "tokens=1,2 delims=:" %%1 in ('findstr /o "^" "!loc!"') DO (
        set new_pos=%%1
        echo new_pos !new_pos!
    )
)

Все, что я сделал, это заменил test_1.txt на! FileName [%% i ]! , или используйте новую переменную и замените все на "! Lo c!" .

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

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

1 Ответ

2 голосов
/ 04 марта 2020

Это очевидно!

При использовании !file... вы вводите восклицательный знак в строку.

Это запускает фаза 5 (фаза отложенного расширения) синтаксического анализатора .
На этом этапе переменные раскрываются , и для перехода к следующему символу используются каретки. , независимо от того, где они (указаны или нет)!

Поэтому ваша строка поиска "^" преобразуется в "".

Просто удвойте каретку до findstr /o "^^" !File...

Эффект восклицания немного неожиданный

setlocal EnableDelayedExpansion
echo One Caret "^"
echo One Caret "^" and a bang ^^!

Вывод

One Caret "^"
One Caret "" и удар!

...