合并时批处理文件不会运行(在批处理文件中退出 ghostscript

Posted

技术标签:

【中文标题】合并时批处理文件不会运行(在批处理文件中退出 ghostscript【英文标题】:Batch files won't run when combined (quitting ghostscript in a batch file 【发布时间】:2014-06-30 22:10:18 【问题描述】:

我有两个批处理文件,都是简单的命令。如果我双击它们的图标,两者都可以正常工作。我想合并它们。

第 1 部分如下所示:(%1 是来自 RedMon 的传入 PostScript)

"c:\program files\gs\gs9.14\bin\gswin64c.exe" -dBATCH -dNOPAUSE -dSTRICT -dSAFER -sDEVICE=jpeg -r300 -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -o "c:\path\temp_label.jpg" %1

第 2 部分如下所示:

convert -quality 99 -density 300 -crop 1240x1760+110+100 -chop 0x200+0+900 -rotate 90 "c:\path\temp_label.jpg" "c:\path\temp_label_edit.jpg"

composite -gravity center "c:\users\mary\documents\labels\temp_label_edit.jpg" "c:\path\new_shipping_label.jpg" "c:\path\temp_label_small.jpg"

convert -quality 99 -density 300 -resize  3059 "c:\path\temp_label_small.jpg" "c:\path\temp_label_resize.jpg"

imdisplay /p "c:\path\temp_label_resize.jpg"
mspaint "c:\path\temp_label_resize.jpg"

第 1 部分是一个 ghostscript 命令,它只是从传入的 postscript 生成一个 jpg 文件。当我打印并且工作正常时,它由 RedMon(使用 redrun.exe)调用。第 2 部分是 imagemagick,它裁剪图像,将其添加到另一层,并将结果作为文件显示给我,并将其定向到另一台(真实)打印机。

当我只运行第一部分时,它会在我打印时自动给我文件。如果我双击第 2 部分的图标,它可以工作。但我想做的是,因为我们每天至少运行 12 次,所以让它们从单个批处理文件运行。

它的作用:当我合并两个批处理文件时,正确生成了来自 GS 的原始文件。但随后我从 imdisplay 和 paint 收到一条消息,即“找不到...temp_label_resize.jpg”。但就像我提到的,如果我单独运行它们,它们就可以工作。

我的尝试:

    添加和删除 -dBATCH 等。来自传递给 GhostScript 的参数 使用 ping 方法在命令之间暂停以留出运行时间 将文件分开并从单个文件中调用它们,即 1.bat 调用 2.bat 和 3.bat。结果相同。 删除除 %1 之外的所有变量(代码反映了这一点) 在创建后立即调用以打开不同的文件名:创建的​​唯一文件是原始 temp_label.jpg 运行 gswin64 而不是 gswin64c - 没有报告故障,仍然没有执行 imagemagick 代码。 从 cmd 调用 convert 以确保我得到的是 imagemagick 的转换而不是其他东西。

我的假设是,由于从未创建过 imagemagick 文件,因此 GhostScript 结尾或我的 imagemagick 代码存在问题。但是,我的 imagemagick 代码可以正常执行。因此,我的猜测是 GS 没有正确退出。我可能遗漏了一些明显的东西,任何帮助将不胜感激。

【问题讨论】:

gswin64.exe 是立即返回还是在完成后返回?我最初的怀疑是事情是同时发生的。 啊,刚刚又有了一个想法。 redrun.exe 的环境是否正确设置了 PATH 以查找转换和复合?我注意到您已指定 gswin64c.exe 的完整路径 猜猜我们的cmets被越过了。这就是解决方案!原始评论:实际上,它们是按顺序运行的。但是在检查时(使用 Start /Wait 弹出多个框)我发现了问题 - 虽然我可以在命令行上键入 convert 并在独立的批处理文件中执行它,并且 100% 的时间得到 imagemagick convert ,由于某种原因,它调用了 windows convert 可执行文件。 @GeekyDeaks - 所以我需要为每个程序指定一个单独的路径?因为复合被称为没有问题。另外,写一个答案,我会标记它。谢谢! 通常当一个程序启动时,它会继承其父级的环境。我假设 redrun.exe/RedMon 是通过打印假脱机服务启动的,因此它会从服务中获取包括 PATH 在内的环境。这可能(并且似乎在您的情况下)与您从启动 CMD 获得的环境不同。就个人而言,我只会指定所有命令的完整路径,以 100% 确保您知道发生了什么 【参考方案1】:

似乎 redrun.exe 的 PATH 环境变量与启动命令提示符时的环境变量不同。我建议您完整指定每个命令的路径,类似于您为 gswin64c.exe 所做的,例如

"c:\program files\gs\gs9.14\bin\gswin64c.exe" ....
"c:\program files\ImageMagick\bin\convert.exe" ....

等等..等等..

这样您就可以 100% 确定您正在运行正确的可执行文件。

【讨论】:

谢谢 - 就是这样。我没有意识到打印后台处理程序的 PATH 与其他程序不同。看来它可能仍然可以访问“常规”路径(因为我可以在不写出路径的情况下获得复合)但也许它们的顺序不同,如下所示:link 我认为你很可能是对的。如果您感到好奇,您可以在批处理文件中echo %PATH% 并将其与 CMD 中的进行比较。我觉得这很有趣,因为我对 windows 不是很熟悉,但是当我开始使用 cron 时,这个问题在 unix 下每年都会让我感到困惑:) 回声路径的好想法是相同的(太长,无法在此处发布)。很高兴听到这不是一个只有胜利的问题。 :P

以上是关于合并时批处理文件不会运行(在批处理文件中退出 ghostscript的主要内容,如果未能解决你的问题,请参考以下文章

windows批处理文件不退出

退出批处理文件中的 FOR 循环?

简单的批处理文件作业

如何阻止 Windows 批处理文件提前退出?

当我在批处理文件中运行下面的代码时,它只会执行第一行并且不会关闭命令窗口

将 Microsoft Access 作为计划任务运行后退出