У меня есть 1 батник. У меня есть 5 файлов данных, которые находятся в 5 разных папках. Структуры данных одинаковы: одинаковое количество столбцов, одинаковые имена файлов, но отличается только содержимое. Как передать несколько параметров в пакетный файл? Вот пример загрузки данных для 1 папки. Что делать с данными, расположенными в 4 других папках (Folder2… .Folder5)? Пожалуйста, мне нужна твоя помощь.

@echo off
for %%F in ("C:\Temp\Folder1\*.txt") do (
sqlldr USERID=xyz/xyz@db CONTROL='C:\Temp\Folder1\TEST.ctl' 
LOG='C:\Temp\Folder1\TEST.log' "DATA=%%F"
goto AfterLoop
)
:AfterLoop
0
serob 23 Окт 2018 в 21:42

2 ответа

Лучший ответ

Я понятия не имею, как использовать инструмент, и никогда не читал справочную информацию / информацию об использовании, поэтому это только предположение:

@Echo Off
For %%A In (1 2 3 4 5) Do (
    PushD "C:\Temp\Folder%%A"
    SQLLdr USERID=xyz/xyz@db CONTROL=TEST LOG=TEST DATA=*.txt
    PopD
)

:AfterLoop

Если DATA не принимает подстановочный знак, возможно, добавление вложенного цикла сделает это:

@Echo Off
For %%A In (1 2 3 4 5) Do (
    PushD "C:\Temp\Folder%%A"
    For %%B In (*.txt) Do (
        SQLLdr USERID=xyz/xyz@db CONTROL=TEST LOG=TEST DATA='%%B'
    )
    PopD
)

:AfterLoop

И, конечно же, поскольку теперь вы почти гарантированно сообщите нам, что имена папок были неточными, вы можете настроить это аналогичным образом:

@Echo Off
For %%A In (
    "C:\Temp\Folder1"
    "C:\Temp\Folder2"
    "C:\Temp\Folder3"
    "C:\Temp\Folder4"
    "C:\Temp\Folder5"
) Do (
    PushD "%%A"
    SQLLdr USERID=xyz/xyz@db CONTROL=TEST LOG=TEST DATA=*.txt
    PopD
)

:AfterLoop

Или же:

@Echo Off
For %%A In (
    "C:\Temp\Folder1"
    "C:\Temp\Folder2"
    "C:\Temp\Folder3"
    "C:\Temp\Folder4"
    "C:\Temp\Folder5"
) Do (
    PushD "%%A"
    For %%B In (*.txt) Do (
        SQLLdr USERID=xyz/xyz@db CONTROL=TEST LOG=TEST DATA='%%B'
    )
    PopD
)

:AfterLoop
0
Compo 23 Окт 2018 в 19:19

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

FOR /D %%G IN (C:\temp\*) DO ...

Затем вы можете использовать это как часть вашей внутренней команды FOR:

FOR %%F IN ("%%G\*.txt") do ....

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

@echo off
FOR /D %%G IN (C:\temp\*) DO (
    for %%F in ("%%G\*.txt") do (
        sqlldr USERID=xyz/xyz@db CONTROL='%%G\TEST.ctl' LOG='%%G\TEST.log' "DATA=%%F"
    )
)
1
Squashman 23 Окт 2018 в 19:07
52955878