Пакетный скрипт MS-DOS: операция присваивания - PullRequest
3 голосов
/ 08 июня 2011

Я имею в виду приведенную ниже угрозу Пакетные файлы: Как прочитать файл? .Для получения построчно из текстового файла.Я использую следующий скрипт:

@echo off
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ paths.txt"`) do (
    set "var=%%a"
    SETLOCAL EnableDelayedExpansion
    set "var=!var:*:=!"
    echo !var!
    ENDLOCAL
)

Код работает нормально!Значения в !var! нельзя присвоить какой-либо переменной.:( Я структурирую там, Пожалуйста, кто-нибудь поможет читать построчно, и я хочу присвоить какую-то переменную и хочу манипулировать этой переменной. Пожалуйста, помогите решить эту ситуацию.

Обновление:

@ECHO off

CLS

SET PROJ_DIR=D:\workspace\proj
SET PROMO_DIR=D:\TEST
SET SOURCE_CODE=\Source Code

SETLOCAL DisableDelayedExpansion
for /f %%a in (paths.txt) do (
    SET "var=%%a"
    SETLOCAL EnableDelayedExpansion
    set "var=!var:*:=!"
    set FILE_PATH=!var://www.domain.com/path/dir=!
    SET FILE_PATH=!FILE_PATH:/=\!
    SET PROMO_FILE_PATH=!PROMO_DIR!!SOURCE_CODE!!FILE_PATH! 
    FOR %%i IN ("!PROMO_FILE_PATH!") DO SET FOLDER_PATH=%%~dpi
    FOR %%i IN ("!PROMO_FILE_PATH!") DO SET FILE_NAME=%%~nxi
    IF EXIST "!FOLDER_PATH!" GOTO F3
        MKDIR "!FOLDER_PATH!"
    :F3
    IF NOT EXIST "!PROJ_DIR!!FILE_PATH!" GOTO F4
        COPY "!PROJ_DIR!!FILE_PATH!" "!FOLDER_PATH!"
    :F4
        ECHO Cannot find the file under "!PROJ_DIR!!FILE_PATH!"

    ENDLOCAL
)

SET CLOSE_CONFIRM=
SET /P CLOSE_CONFIRM=Press any key to close the window...%=%

paths.txt

//www.domain.com/path/dir/dir1/dir2/file1.txt 
//www.domain.com/path/dir/dir1/dir2/file2.txt 
//www.domain.com/path/dir/dir1/dir2/file3.txt 
//www.domain.com/path/dir/dir1/dir2/file4.txt 
//www.domain.com/path/dir/dir1/dir3/file1.txt

Вывод команды

        1 file(s) copied.
Cannot find the file under "D:\workspace\proj\dir1\dir2\file1.txt"
        1 file(s) copied.
Cannot find the file under "D:\workspace\proj\dir1\dir2\file2.txt"
Press any key to close the window...

спасибо ..

Ответы [ 4 ]

2 голосов
/ 30 июня 2011

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

FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ paths.txt"`) do call :HandlePath %%a
goto :eof

================
:HandlePath
set "var=%*"
set "var=%var:*:=%"
echo %var%
goto :eof

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

2 голосов
/ 08 июня 2011

Ключ - это отложенное расширение, всегда расширяйте свои переменные внутри круглых скобок с !, а не с %.

Сэмплом, который изменяется X с Y

@echo off
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ paths.txt"`) do (
    set "var=%%a"
    SETLOCAL EnableDelayedExpansion
    set "var=!var:*:=!"
    set "myVar=!var!"
    set "myVar=!myVar:X=Y!"
    echo X replaced with Y =!myVar! 
    ENDLOCAL
)

В вашей обновленной версии goto: label немедленно останавливает цикл for

Лучше переписать его в IF-Blocks

IF NOT EXIST "!FOLDER_PATH!" (
  MKDIR "!FOLDER_PATH!"
)
IF EXIST "!PROJ_DIR!!FILE_PATH!" (
    COPY "!PROJ_DIR!!FILE_PATH!" "!FOLDER_PATH!"
) ELSE
(
    ECHO Cannot find the file under "!PROJ_DIR!!FILE_PATH!"
)
1 голос
/ 08 июня 2011

Если вы хотите прочитать каждую строку и манипулировать ею:

SETLOCAL EnableDelayedExpansion
FOR /F "tokens=*" %%a IN (paths.txt) DO (
set var=%%a
ECHO %var%
PAUSE
)
ENDLOCAL

Если вы пытаетесь найти строку из файла и манипулировать ею:

SETLOCAL EnableDelayedExpansion
FOR /F "tokens=* usebackq" %%a IN (`FIND /I 'string to search for' "C:\folder\paths.txt"`) DO (
set var=%%a
ECHO %var%
PAUSE
)
ENDLOCAL

Если вы пытаетесь найти строку и манипулировать каждым словом в строке:

SETLOCAL EnableDelayedExpansion
FOR /F "usebackq tokens=1-999 delims= " %%a IN (`FIND /I 'string to search for' "C:\folder\paths.txt"`) DO (
REM %%a = first word  %%b = second word etc. through the alphabet
set var1=%%a%%b%%c
set var2=%%d
ser var3=%%e
ECHO %var1% %var2% %var3%
PAUSE
)
ENDLOCAL
0 голосов
/ 08 июня 2011

Это работает для меня:

@echo off
SETLOCAL EnableDelayedExpansion

FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ paths.txt"`) do (
set var=%%a
set var=!var:*:=!
echo !var!
)
ENDLOCAL
...