Вывод буфера перед передачей - PullRequest
0 голосов
/ 11 января 2012

Мне нужно написать пакетный файл, который передает выходные данные SQLCMD в приложение, которое будет изменять таблицы, из которых SQLCMD читает:

sqlcmd -E -h-1 -S . -d Database -i Script.sql|ModifyApplication.exe

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

sqlcmd -E -h-1 -S . -d Database -i Script.sql>tmp.txt
type tmp.txt|ModifyApplication.exe

Это работает - но это ужасно, потому что ему нужно записать в файловую систему , и если по какой-то причине SQLCMD не сможет записать файл, тогда старый файл из предыдущего запуска будет передан в ModifyApplication.exe .

Было бы идеально, если бы я мог просто буферизовать все данные из sqlcmd в память перед передачей их в ModifyApplication.exe следующим образом:

sqlcmd -E -h-1 -S . -d Database -i Script.sql|Buffer.exe|ModifyApplication.exe

Есть ли в Windows команда, похожая на Buffer.exe?

Ответы [ 4 ]

1 голос
/ 11 января 2012

Вы можете попробовать мою программу PIPE.COM.Создайте его так:

@ECHO off
if not exist pipe.com call :DefinePipe
sqlcmd -E -h-1 -S . -d Database -i Script.sql|pipe|ModifyApplication.exe

goto :EOF

:DefinePipe
setlocal DisableDelayedExpansion
set pipe=´)€ì!Í!ŠÐŠà€Ä!€ü.t2€ü+u!:æu8²A€ê!´#€ì!Í!².€ê!´#€ì!Í!²+€ê!´#€ì!Í!Šò€Æ!´,€ì!Í!"Àu°´LÍ!ëÒ
setlocal EnableDelayedExpansion
echo !pipe!>pipe.com
exit /B

Вы должны знать, что мой PIPE.COM вставляет пустое пространство в пустые строки.Однако я могу изменить это поведение, если оно вам не нужно.

EDIT : добавлен исходный код, запрошенный Мартином

Пакетный файл ниже создает более простую версию PIPE.COM, который не проверяет наличие пустых строк:

(
echo    A100
echo    mov     ah,8            ;AH = CONSOLE_INPUT_WITHOUT_ECHO
echo    int     21H             ;get next char. in AL
echo    mov     dl,al           ;pass it to DL
echo    mov     ah,2            ;AH = VIDEO_OUTPUT
echo    int     21H             ;show the char. in the screen
echo    mov     ah,0B           ;AH = CHECK_KEYBOARD_STATUS
echo    int     21H             ;get key status in AL: 0=no more keys
echo    cmp     al,0            ;is there another key?
echo    jne     100             ;yes: go back for it
echo    mov     ah,4C           ;AH = TERMINATE_PROGRAM
echo    int     21H             ;terminate this program
echo/
echo    RCX
echo    16
echo    W
echo    Q
) | DEBUG PIPE.COM

Чтобы получить базовую справку по использованию DEBUG, введите DEBUG затем?затем Q. Если у вас нет программы DEBUG.COM, вы можете получить ее с с этого сайта

0 голосов
/ 11 января 2012

Как подсказали нам, я написал один:

using System;
using System.Collections.Generic;

namespace Buffer
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach(string line in new List<string>(GetLines()))
            {
                Console.WriteLine(line); 
            }
        }

        static IEnumerable<string> GetLines()
        {
            string line;
            while (!string.IsNullOrEmpty(line = Console.ReadLine()))
            {
                yield return line;
            }
        }
    }
}
0 голосов
/ 11 января 2012

, даже если sqlcmd «не удается записать в файловую систему», оператор > удалит предыдущий tmp.txt, поэтому он не будет повторно использовать «старый файл из предыдущего запуска».Однако вы всегда можете убедиться, что это не так, вставив команду del tmp.txt перед выполнением sqlcmd.

0 голосов
/ 11 января 2012

Нет такой стандартной утилиты.Вы должны написать один, это довольно простая вещь для создания.

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