HTMLHelp编译器可以从命令行完美运行,但不能从脚本或批处理文件运行

时间:2016-08-25 17:01:19

标签: python windows batch-file cmd chm

我正在尝试从脚本运行windows helpfile编译器(hhc.exe),但它显示出非常意外的行为。

当我从带有hhc pathtohelpproject.hpp的cmd.exe运行它时,将按预期编译帮助文件。但是,从具有相同工作目录的python调用完全相同的命令会导致程序返回0并且没有输出。

但它变得更奇怪:我已经创建了一个批处理文件runhhc.bat

hhc "pathtohelpproject.hpp"

我通过调用call runhhc.batstart runhhc.batrunhhc.bat从python脚本运行。

所有这些都导致了相同的行为。但是,使用start runhhc.bat cmd实例在hhc返回后仍然打开,所以我尝试再次手动输入命令,但没有成功。但是当我用新手动打开的cmd进入命令时,它也没有用!实际上,只有在我关闭由我的脚本打开的cmd后它才开始工作。

这种离奇行为的解释是什么?我怎样才能从脚本运行编译器?

1 个答案:

答案 0 :(得分:0)

完全归结为hhc.exe,没有别的。诀窍是在运行后查看%ERRORLEVEL%。它返回" 1"尽管成功了。如果hhc.exe运行与其他东西隔离,这可以在自定义命令中用于警告用户它是虚假的。 HHC.exe正在使用HHA.dll。关于HHA.dll信息尚未发布。 Microsoft根据保密协议(NDA)将HHA接口信息授予已批准的帮助ISV。

D:\_working>"C:\Program Files (x86)\HTML Help Workshop\hhc" foobar.hhp
Microsoft HTML Help Compiler 4.74.8702

Compiling d:\_working\foobar.chm

...

Compile time: 0 minutes, 1 second
22      Topics
87      Local links
2       Internet links
0       Graphics

Created d:\_working\foobar.chm, 305,338 bytes
Compression decreased file by 53,639 bytes.

D:\_working>echo %errorlevel%
1

要解决此问题并继续,您需要在批处理文件中添加if not %errorlevel% 1 exit /B 1

@echo off
REM -----------------------------------------
REM batch file  is located in D:\_batch
REM HH project file is located in D:\_working
REM -----------------------------------------
cd ..\_working
echo '//--- HH Compiler start --------------------------------------
"C:\Program Files (x86)\HTML Help Workshop\hhc" foobar.hhp
echo '//--- HH Compiler end   --------------------------------------
echo '//--- errorlevel -------------------------------------------
echo %errorlevel%
echo '//------------------------------------------------------------
if not %errorlevel% 1 exit /B 1

调用此批处理的python脚本:

print ("*******************************")
print ("We compile a CHM help file  ...")
print ("*******************************")
# First import the 'ctypes' module. ctypes module provides C compatible data types and allows calling functions in DLLs or shared libraries.
import ctypes  # An included library with Python install.
# ctypes.windll.user32.MessageBoxW(0, "Open CHM", "Your title", 1) # OK only
messageBox = ctypes.windll.user32.MessageBoxA
# documentation: https://msdn.microsoft.com/en-us/library/windows/desktop/ms645505(v=vs.85).aspx
returnValue = messageBox(None,"Compile Help Module (CHM) now?","CHM and Python",1) # 1=OK Cancel, 2=Cancel, Retry, Ignore

if returnValue == 1:
    print("Pressed OK")
    # How to compile a chm file in Python?
    # ---------------------------------
    import os   
    os.system("D:/_batch/run-hhc.bat")

elif returnValue == 2: 
    print("user pressed cancel button!")

enter image description here

您可能有兴趣从python脚本调用CHM:

# How to open a chm file in Python?
# ---------------------------------
# os.system("hh.exe D:/UserData-QGIS-Python/Projekte/ConnectChm/CHM-example.chm")
import os 
os.system("hh.exe D:/UserData-QGIS-Python/Projekte/ConnectChm/CHM-example.chm::/garden/garden.htm")