用于批处理 .incx 文件的 C# 和 ExtendScript
C# and ExtendScript for batch processing of .incx files
我有大量 .incx 文本文档聚集到它们自己的子文件夹中,我需要遍历这些子文件夹并将其转换为纯文本,作为我创建的 C# winform 应用程序的一部分。我有最新版本的 InCopy 和 ExtendScript 工具包,以及一个 .jsx 脚本,非常适合安静快速地创建我的纯文本文件。
我的 problem/question 没有太多关于如何在 运行ning 第三方应用程序中从 C# class 中最好地启动它的指导,发送相关信息.当我 运行 我的 .jsx 脚本时,我需要从我的应用程序向它发送一个目标文件夹,它可以在其中找到 .incx 文件。
目标文件夹将是动态的,具体取决于我的应用程序中之前的其他操作。
我在 Adobe 的论坛上发现了一些模糊的解决方案提示,涉及额外的 .vbs 文件 and/or 外部临时文件来保存参数,但它们都已经过时了,所以我想我会问看看是否有人知道现代方法。有什么不明白的,我会第一时间回复说明。
通过更多的谷歌搜索和我自己的反复试验,我找到了答案。
我能找到的最好方法是在 VBS 中完成所有 InCopy 脚本,然后使用 Process 实例通过 cscript 发送我的 arg。
示例 C#:
Process myScriptProc = new Process();
myScriptProc.StartInfo.FileName = @"cscript";
myScriptProc.StartInfo.WorkingDirectory = rootDir + "\"; // rootDir being the path where my vbs lives
myScriptProc.StartInfo.Arguments = "MyScript.vbs " + filesPath; // filesPath is the arg sent to the script
myScriptProc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
myScriptProc.Start();
myScriptProc.WaitForExit();
myScriptProc.Close();
MyScript.vbs
main
Function main()
Set myInCopy = CreateObject("InCopy.Application.CC.2015")
Set obj = CreateObject("Scripting.FileSystemObject")
myInCopy.ScriptPreferences.UserInteractionLevel = 1699640946
myFormat = 1952412773
myExtension = ".txt"
Set objFSO = CreateObject("Scripting.FileSystemObject")
objStartFolder = WScript.Arguments(0)
Set objFolder = objFSO.GetFolder(objStartFolder)
Set colFiles = objFolder.Files
For Each x In colFiles
If LCase(objFSO.GetExtensionName(x.name)) = "incx" Then
thisDoc = x
Set myDoc = myInCopy.open(thisDoc)
Set myStory = myInCopy.ActiveDocument.Stories.Item(1)
parts = split(x.Name, ".")
myFilePath = objStartFolder & "/" & parts(0) & myExtension
myStory.Export myFormat, myFilePath
myDoc.close()
obj.DeleteFile(thisDoc)
End If
Next
myInCopy.ScriptPreferences.UserInteractionLevel = 1699311169
End Function
我用 VBScript 重写了我的 JavaScript 文件,因为从 Adobe 论坛上的风滚草来看,我永远不会得到任何答案,为什么他们的文档示例调用 DoJavaScript文件生成对象缺少方法错误。
我 运行 在 VB 中重做我的脚本后遇到的最大障碍是,如果你 运行外部的脚本。如果您查看 MyScript.vbs,您会看到一些看起来像 运行dom 10 位数字值的实例。这些来自这里:
http://jongware.mit.edu/idcs5js_html_3.0.3i/idcs5js/index_Enum%20Suite.html
祝福创建该资源的人,因为我在 Adobe 的任何文档中都找不到该信息来挽救我的生命。
TL;DR: 如果您尝试在 Adobe 应用程序之外使用 运行 的流程和脚本进行自动化,请在 VBScript 中执行所有操作,并注意神秘的十进制枚举。
没用的脚注:
MyScript.vbs 此处从传入的目录中读取所有 *.incx 文件,导出为普通 .txt(具有相同的文件名,进入相同的目录),并删除原始文件。
我有大量 .incx 文本文档聚集到它们自己的子文件夹中,我需要遍历这些子文件夹并将其转换为纯文本,作为我创建的 C# winform 应用程序的一部分。我有最新版本的 InCopy 和 ExtendScript 工具包,以及一个 .jsx 脚本,非常适合安静快速地创建我的纯文本文件。
我的 problem/question 没有太多关于如何在 运行ning 第三方应用程序中从 C# class 中最好地启动它的指导,发送相关信息.当我 运行 我的 .jsx 脚本时,我需要从我的应用程序向它发送一个目标文件夹,它可以在其中找到 .incx 文件。
目标文件夹将是动态的,具体取决于我的应用程序中之前的其他操作。
我在 Adobe 的论坛上发现了一些模糊的解决方案提示,涉及额外的 .vbs 文件 and/or 外部临时文件来保存参数,但它们都已经过时了,所以我想我会问看看是否有人知道现代方法。有什么不明白的,我会第一时间回复说明。
通过更多的谷歌搜索和我自己的反复试验,我找到了答案。
我能找到的最好方法是在 VBS 中完成所有 InCopy 脚本,然后使用 Process 实例通过 cscript 发送我的 arg。
示例 C#:
Process myScriptProc = new Process();
myScriptProc.StartInfo.FileName = @"cscript";
myScriptProc.StartInfo.WorkingDirectory = rootDir + "\"; // rootDir being the path where my vbs lives
myScriptProc.StartInfo.Arguments = "MyScript.vbs " + filesPath; // filesPath is the arg sent to the script
myScriptProc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
myScriptProc.Start();
myScriptProc.WaitForExit();
myScriptProc.Close();
MyScript.vbs
main
Function main()
Set myInCopy = CreateObject("InCopy.Application.CC.2015")
Set obj = CreateObject("Scripting.FileSystemObject")
myInCopy.ScriptPreferences.UserInteractionLevel = 1699640946
myFormat = 1952412773
myExtension = ".txt"
Set objFSO = CreateObject("Scripting.FileSystemObject")
objStartFolder = WScript.Arguments(0)
Set objFolder = objFSO.GetFolder(objStartFolder)
Set colFiles = objFolder.Files
For Each x In colFiles
If LCase(objFSO.GetExtensionName(x.name)) = "incx" Then
thisDoc = x
Set myDoc = myInCopy.open(thisDoc)
Set myStory = myInCopy.ActiveDocument.Stories.Item(1)
parts = split(x.Name, ".")
myFilePath = objStartFolder & "/" & parts(0) & myExtension
myStory.Export myFormat, myFilePath
myDoc.close()
obj.DeleteFile(thisDoc)
End If
Next
myInCopy.ScriptPreferences.UserInteractionLevel = 1699311169
End Function
我用 VBScript 重写了我的 JavaScript 文件,因为从 Adobe 论坛上的风滚草来看,我永远不会得到任何答案,为什么他们的文档示例调用 DoJavaScript文件生成对象缺少方法错误。
我 运行 在 VB 中重做我的脚本后遇到的最大障碍是,如果你 运行外部的脚本。如果您查看 MyScript.vbs,您会看到一些看起来像 运行dom 10 位数字值的实例。这些来自这里:
http://jongware.mit.edu/idcs5js_html_3.0.3i/idcs5js/index_Enum%20Suite.html
祝福创建该资源的人,因为我在 Adobe 的任何文档中都找不到该信息来挽救我的生命。
TL;DR: 如果您尝试在 Adobe 应用程序之外使用 运行 的流程和脚本进行自动化,请在 VBScript 中执行所有操作,并注意神秘的十进制枚举。
没用的脚注: MyScript.vbs 此处从传入的目录中读取所有 *.incx 文件,导出为普通 .txt(具有相同的文件名,进入相同的目录),并删除原始文件。