Почему переменные, установленные для циклов, не существуют - PullRequest
0 голосов
/ 06 мая 2019

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

Код перебирает подпапки ( q1, q2 и т. Д. ) в каталоге. Для каждой подпапки есть другой цикл for для установки нескольких переменных. Я повторил три переменные нормально в циклах. Однако при использовании пакета с именем abc.rb ошибка COM_M не существует. На самом деле ошибка в том, что все три переменные не существуют.

setlocal ENABLEDELAYEDEXPANSION
for /f %%f in ('dir /ad /b ') do (
    echo %%f
    pause
    pushd %%f
    for  %%a in (*.a*.dat) do (
        set COM_DATA=%%a
        echo !COM_DATA!
        set COM_V=%%f\com-v.dat
        echo !COM_V!
        set COM_M=%%f\com-M.dat
        echo !COM_M!
    )
    chdir
    set fig=someA
    set matrix=someB

    rem use a written batch (called abc.rb) to process data
    abc.rb  -a !COM_DATA!  -b !COM_V!  -c !COM_M! -d !fig! -e !matrix!

    popd
)
endlocal

Может кто-нибудь найти ошибки? Спасибо!

Ответы [ 2 ]

1 голос
/ 06 мая 2019

Я не уверен, почему нужно pushd в каталог, но, насколько я вижу, существует только необходимость в одном цикле for:

@echo off
setlocal enabledelayedexpansion
set "fig=someA"
set "matrix=someB"
for  /R %%a in (*.a*.dat) do (
    set "COM_DATA=%%a"
    echo !COM_DATA!
    set "COM_V=%%~dpacom-v.dat
    echo !COM_V!
    set COM_M=%%~dpacom-M.dat
    echo !COM_M!
    rem If abc.rb is is NOT a windows batch file, remove call below
    call abc.rb  -a "!COM_DATA!"  -b "!COM_V!"  -c "!COM_M!" -d !fig! -e !matrix!
)

Если вам требуется pushd (в чем я сомневаюсь)

@echo off
setlocal enabledelayedexpansion
set "fig=someA"
set "matrix=someB"
for  /R %%a in (*.a*.dat) do (
    pushd "%%~dpa"
    set "COM_DATA=%%a"
    echo !COM_DATA!
    set "COM_V=%%~dpacom-v.dat"
    echo !COM_V!
    set "COM_M=%%~dpacom-M.dat"
    echo !COM_M!
    rem If abc.rb is is NOT a windows batch file, remove call below
    call abc.rb  -a "!COM_DATA!"  -b "!COM_V!"  -c "!COM_M!" -d !fig! -e !matrix!
    popd
)

Двойные кавычки помогут, если пути имеют пробелы, если у вашей программы есть проблема с ними, то вы можете удалить их: abc.rb -a !COM_DATA! -b !COM_V! -c !COM_M! -d !fig! -e !matrix!

0 голосов
/ 06 мая 2019
@echo off
setlocal ENABLEDELAYEDEXPANSION

set "fig=someA"
set "matrix=someB"
set "COM_V=com-v.dat"
set "COM_M=com-M.dat"

for /f %%f in ('dir /ad /b') do (
    echo %%f
    pause
    if exist "%%~f\*.a*.dat" (
        pushd "%%~f" && (
            for  %%a in (*.a*.dat) do (
                set "COM_DATA=%%~a"
                echo !COM_DATA!
            )
            chdir

            rem use a written batch called abc.rb to process data
            call abc.rb  -a "!COM_DATA!"  -b "!COM_V!"  -c "!COM_M!" -d "!fig!" -e "!matrix!"

            popd
        )
    )
)
endlocal

Проблемы:

  1. Если вложенный цикл for не находит файлов с совпавшим шаблоном *.a*.dat, то переменные COM_DATA, COM_V иCOM_M не может быть определено или обновлено с использованием более нового значения.

  2. Значение COM_DATA - это имя файла.Значения COM_V и COM_M - это имя родительской папки и имя файла, что не соответствует.Основываясь на текущем каталоге, я бы посчитал имена файлов правильными.Это означает, что COM_V и COM_M никогда не нужно менять.

  3. Если abc.rb является пакетным файлом, то вам нужно использовать call для возврата интерпретаторавернитесь к основному сценарию.

Изменения:

  1. Проверьте, существует ли шаблон файла, и запустите код в блоке кода, если true.

  2. COM_V и COM_M перемещены из цикла for, поскольку значения никогда не меняются.

  3. Вызов abc.rb какявляющийся пакетным файлом.

  4. fig и matrix перемещены из цикла for, поскольку значения никогда не меняются.

  5. Установка двойных кавычек для переменных и использование переменных для избежания проблем с пробелами, специальными символами и т. Д.

  6. pushd && ( обеспечивает выполнение кода в скобках только при успешном изменении каталога.

  7. Удалены скобки в строке rem.Они могут не вызывать проблемы, хотя rem строки анализируются и могут вызвать синтаксическую ошибку.Рекомендуется избегать специальных символов в rem строках, если вы не собираетесь отлаживать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...