【发布时间】:2015-08-05 17:41:35
【问题描述】:
情况
我坐在程序 A(redmon,端口监视器)的接收端。我需要编写一个批处理脚本,程序 A 可以调用它来将大量数据(PostScript)导入。
每当程序 A 调用我的批处理脚本时,我都需要将该数据传递给程序 B(Ghostscript),并最终让程序 C(此处称为 dosomething)对程序 B 的输出进行处理。
它如何与 Bash(Unix shell)一起工作
在 bash 脚本中,我会编写一个脚本(我们称之为 myscript.sh),例如:
#!/bin/bash
cat - | gs -sDEVICE=pdfwrite -o test.pdf -f -
dosomething test.pdf
当有人将一些数据输入其中时,这将完美地工作:
cat testdata.ps | myscript.sh
它是否适用于 Windows 批处理文件?
因为这是针对 Windows 的,所以我需要一些可以像这样调用的东西
type testdata.ps | myscript.bat
因为,实际上,这就是程序 A 调用myscript.bat 的方式。所以我尝试将 bash 方法 1:1 转换为批处理文件:
@echo off
type con | "%PROGRAMFILES%\gs\gs9.16\bin\gswin32c" -o test.pdf -f -
dosomething test.pdf
问题是,type con 似乎无法识别什么时候没有任何东西需要处理,因此批处理脚本会挂起。那么,我该怎么办?
我试过它是否可以反过来工作,比如
"%PROGRAMFILES%\gs\gs9.16\bin\gswin32c" -o test.pdf -f - < CON
但也没有运气。将CON 复制到文件的尝试也失败了
copy con test.ps
如何解决这个问题?这一切都归结为捕获整个管道内容并识别程序 A 何时关闭管道。
【问题讨论】:
-
什么时候没有任何东西需要处理?或者
cat既然是用户输入,怎么能算出来? -
那个bash脚本是程序A还是程序B?
-
@CristiFati 好问题 - 程序 A 通过管道输出整个文件。
bash会注意到stdin管道何时“关闭”。我想知道批处理脚本如何也能注意到。 -
您不能将
con与管道输入一起使用。con设备指的是交互式控制台,而不是标准输入。但是如果批处理脚本的输入被重定向,那么子进程将继承重定向的输入,因此您不需要做任何事情 - 只需让批处理脚本运行程序即可。 -
@HarryJohnston 在你写这篇文章前几秒钟我才注意到这一点。比我想象的要简单得多!非常感谢。您是否可以将此添加为答案,以便我可以将问题标记为已回答?
标签: windows batch-file pipe