Пакетный скрипт для динамической передачи входных данных в .exe и рекурсивного запуска - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь запустить пакетный сценарий, где он будет извлекать значения из SQL Набор результатов таблицы сервера и передать его в качестве ввода в al oop в .EXE в пакетном сценарии и выполнить рекурсивно.

Пример:

SQL Query: 
select Name from sys.tables

SQL Query output: 
a
b
c

/*Now I have to pass the output of sql query values(a,b,c) I got above as an 
input to Test.exe parameter 3 times in a for or while loop specific to batch 
script one value at a time and executes the exe. 

Example of values passed to exe looks as below.


Test.exe a  -- 1st run in a loop
Test.exe b  -- 2nd run in a loop
Test.exe c  -- 3rd run in a loop

-- My code overview or assumption, I would need the below code snippet to be replaced 
and rewritten in a way it executes successfully using batch script.*/


declare @name int
set @name = count(Name) from sys.tables


DECLARE @Counter INT 

SET @Counter=1

WHILE ( @Counter <= @name)

BEGIN

    C:\Users> .\Test.exe /Input_From_Sql_result_as_argument @Name 

    SET @Counter  = @Counter  + 1
END

Я новичок в пакетном сценарии, если вы можете поделиться некоторыми идеями по реализации этого в пакетном сценарии, это было бы очень полезно. Пожалуйста, дайте мне знать, если я должен поделиться какой-либо информацией ..

1 Ответ

1 голос
/ 19 февраля 2020

Содержимое каждой строки может быть установлено в индексированную переменную, очень похожую на массив, с помощью Setlocal EnableDelayedExpansion и основы c For /F l oop

В зависимости от содержание / структура вашего файла / файлов, которые вам, возможно, не понадобятся при использовании подхода Array. Просто выполните свое действие, используя переменную For / F l oop / s (%% G в этом примере).

Опять же, в зависимости от содержимого, вы можете изменить параметры в for l oop, чтобы получить указанные c токены. (введите For /F в cmd.exe для полного синтаксиса - или найдите и прочитайте множество других вопросов о SO, касающихся обработки содержимого файлов)

После того, как вы установили массив, вы можете использовать For /L l oop для итерации по каждой строке и вставки команд, которые должны быть приняты, используя значение каждой строки.

Если, выполняя рекурсивный запуск, вы хотите запустить это для каждого файла в папке и подпапках (типичное значение в терминах рекурсивного термина, где речь идет о партии, вложите For /F l oop в For /R L oop и обменяйте %inputfile% на %%A в For / F l oop следующим образом:

CD (Изменить каталог) / PUSHD в родительскую папку для повторения и / или / Убедитесь, что пакет запускается из родительской папки

For /R %%A In (*.YOURextension) Do (For /F "delims=" %%G in (%%A) Do (commands))

``

@ECHO OFF
Setlocal EnableDelayedExpansion
Set index=0
Set "inputFile=Your File Path.extension"
For /f "delims=" %%G in (%inputfile%) DO (
REM Perform your action on the content here using %%G
    ECHO(%%G
REM Optional - assign value of each line to indexed variable
    Set /a "index+=1"
    Set "Line[!index!]=%%G"
)

For /L %%I in (1,1,!index!) DO (
REM - Alternate - Perfom your action on the content here using !Line[%%I]!
    ECHO(!Line[%%I]!
)
...