excel - 从powershell调用后ImageJ宏没有运行完成
问题描述
这个项目有一堆活动部件一起工作,但我为这篇文章的目的提出了一个最小的工作示例。这是我正在尝试做的事情:
- 有一个 powershell 脚本等待在目录中创建 .xlsx 文件
- 创建文件时,脚本会启动 imageJ 宏
- imageJ 宏要求运行 VBscript
- VBscript 要求运行 excel 宏
- excel 宏运行后,控制返回到 imageJ 宏,该宏完成并显示一条消息
什么有效:
- powershell 脚本能够检测到正在创建的新 .xlsx 文件
- imageJ 宏启动,进而启动 .vbs 脚本
- .vbs 调用时,excel 宏运行完成
- 当从 imageJ 宏而不是从 powershell 启动时,该过程完美运行
问题:
- 调用 vbs 脚本后 ImageJ 宏未运行完成
- 即使只创建了 1 个新文件,Powershell 也会重复调用 ImageJ 宏
我意识到这可能是完成所需任务的最低效的方法,但以下是每个平台的代码片段:
Powershell脚本:
### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "C:\Users\yourMachine\Desktop"
$watcher.Filter = "*.xlsx*"
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true
### DEFINE ACTIONS AFTER AN EVENT IS DETECTED
$action = { $path = $Event.SourceEventArgs.FullPath
$changeType = $Event.SourceEventArgs.ChangeType
$logline = "$path"
Clear-content "C:\Users\yourMachine\Desktop\log.txt"
Add-content "C:\Users\yourMachine\Desktop\log.txt" -value $logline
cd "C:\Users\yourMachine\Desktop\Fiji.app"
./ImageJ-win64 --ij2 --headless --console --run C:\Users\yourMachine\Desktop\Fiji.app\scripts\example.ijm
}
### DECIDE WHICH EVENTS SHOULD BE WATCHED
Register-ObjectEvent $watcher "Created" -Action $action
while($true) {sleep 5}
ImageJ 宏:
exec("cscript.exe \"C:\\Users\\yourMachine\\Desktop\\example.vbs")
"Hello world!";
脚本:
Option Explicit
example
Sub example()
Dim xlApp
Dim xlBook
Set xlApp = CreateObject("Excel.Application")
xlApp.visible = True
set xlBook = xlApp.Workbooks.Open ("C:\Users\yourMachine\Desktop\example.xlsm", 0)
xlApp.Run xlBook.name & "!Module1.addNumbers"
xlApp.Quit
End Sub
Excel宏:
Sub addNumbers()
ActiveCell.FormulaR1C1 = "1"
Range("A2").Select
ActiveCell.FormulaR1C1 = "2"
Range("A3").Select
ActiveCell.FormulaR1C1 = "3"
Range("A4").Select
ActiveCell.FormulaR1C1 = "4"
Range("A5").Select
ActiveCell.FormulaR1C1 = "5"
Range("A6").Select
ActiveCell.FormulaR1C1 = "6"
Range("A7").Select
ActiveCell.FormulaR1C1 = "7"
Range("A8").Select
ActiveCell.FormulaR1C1 = "8"
Range("A9").Select
ActiveCell.FormulaR1C1 = "9"
Range("A10").Select
ActiveCell.FormulaR1C1 = "10"
Range("A11").Select
End Sub
我非常感谢任何关于如何使这项工作/比当前状态更有效率的帮助或见解。我对所有这些语言都是新手,并且不太了解它们之间正在发生的背景对话。谢谢!