管道之前的缓冲输出

时间:2012-01-11 09:14:15

标签: windows batch-file

我需要编写一个批处理文件,将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 个答案:

答案 0 :(得分:1)

您可以尝试我的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在空行中插入一个空格。但是,如果您不需要,我可以修改该行为。

编辑:添加了源代码,由Martin提出

下面的批处理文件创建了一个更简单的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吗?然后问:如果你没有DEBUG.COM程序,你可以从this site

获得它

答案 1 :(得分:0)

没有这样的标准实用程序。你应该写一个,创建它是一件相当简单的事情。

答案 2 :(得分:0)

正如nos所建议我写了一篇:

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;
            }
        }
    }
}

答案 3 :(得分:0)

即使sqlcmd“无法写入文件系统”,>运算符也会删除之前的tmp.txt,因此不会重复使用“之前运行的旧文件”。但是,您始终可以通过在执行sqlcmd之前插入del tmp.txt命令来确保不会出现这种情况。