Передать текущее имя файла из цикла в метку в пакетном скрипте

В пакетном скрипте я запускаю sqlcmd в цикле, который проходит через папку SQL-скриптов. Я хотел бы иметь возможность передать скрипт / выходной файл, над которым в данный момент ведется работа, на внешнюю метку в цикл в случае ошибки.

Вот пример кода:

@echo off
@setlocal enabledelayedexpansion

SET _INSTANCE=someinstance
SET _DATABASE=somedatabase
SET "_SCRIPTFOLDER=D:\Scripts for Testing"
SET "_OUTPUTFOLDER=D:\Output for Testing"

FOR %%S IN (
    "%_SCRIPTFOLDER%\*.sql"
) DO (

    SET /P _MSGa=Generating CSV: %%~nS.csv ... <NUL

    sqlcmd -b -S %_INSTANCE% -d %_DATABASE% -i "%%~fS" -s "|" -o "%_OUTPUTFOLDER%\%%~nS.csv" -W
    IF ERRORLEVEL >= 1 GOTO sqlcomderrorhandling

    SET /P _MSGb=file created. Removing header dashes ... <NUL

    REM REM Remove the line with dashes below the header
    @FINDSTR /r /b /v /c:"-*|" "%_OUTPUTFOLDER%\%%~nS.csv" > "%_OUTPUTFOLDER%"\tmp.txt
    IF ERRORLEVEL >= 1 GOTO findstrerrorhandling

    XCOPY /Y "%_OUTPUTFOLDER%"\tmp.txt "%_OUTPUTFOLDER%\%%~nS.csv" >NUL
    IF ERRORLEVEL >= 1 GOTO copyerrorhandling

    ECHO done.
)
DEL /Q /F "%_OUTPUTFOLDER%"\tmp.txt
GOTO done

:sqlcomderrorhandling
ECHO An error occurred while processing the file %%~nS.csv

:done
@pause

Последний ECHO просто выводит%~nS.csv, а не фактическое имя файла CSV. Нужно ли как-то использовать функции, чтобы делать то, что я хочу?

1 ответ

Исходя из части первого комментария Рохо и моего собственного, разве такая структура не будет иметь больше смысла?

@Echo Off

Set "_INSTANCE=someinstance"
Set "_DATABASE=somedatabase"
Set "_SCRIPTFOLDER=D:\Scripts for Testing"
Set "_OUTPUTFOLDER=D:\Output for Testing"

If Not Exist "%_OUTPUTFOLDER%\" (Echo Output folder doesn't exist
    Timeout 3 /NoBreak >Nul
    GoTo :EOF)

If Not Exist "%_SCRIPTFOLDER%\*.sql" (Echo Source folder doesn't contain any SQL files
    Timeout 3 /NoBreak >Nul
    GoTo :EOF)

CD /D "%_SCRIPTFOLDER%" 2>Nul || (Echo Source folder, %_SCRIPTFOLDER%, is not available.
    Timeout 3 /NoBreak >Nul
    GoTo :EOF)

For %%A In (*.sql) Do (
    Echo Generating CSV: %%~nA.csv ...
    SQLCmd -b -S %_INSTANCE% -d %_DATABASE% -i "%%A" -s "|" -o "%_OUTPUTFOLDER%\%%~nA.csv" -W 2>Nul && (
        Echo File created. Removing header dashes ...
        Findstr "[^-|]" "%_OUTPUTFOLDER%\%%~nA.csv">"%_OUTPUTFOLDER%"\%%~nA.tmp" && (
            Move /Y "%_OUTPUTFOLDER%"\%%~nA.tmp" "%_OUTPUTFOLDER%\%%~nA.csv">Nul 2>&1 || (
                Echo A Move error occurred while moving %%~nA.tmp
                Timeout 2 /NoBreak >Nul)) || (Echo A FindStr error occurred while removing header dashes 
            Timeout 2 /NoBreak >Nul)) || (Echo A SQLCmd error occurred while processing the file %%~nS.csv
            Timeout 2 /NoBreak >Nul))
Pause
Другие вопросы по тегам