我遇到Powershell脚本问题。 STEPS(1) - (4):
希望清楚我在以下几行代码中所做的事情# STEP (1) Create listener on folder where outputfile.pdf file will be created
# (folder here is `$folder`).
# STEP (2) Wait for new .pdf file to be created.
# STEP (3) When file is created, send mail and print.
# STEP (4) Unsubscribe listener.
$folder = 'X:\foldername'
$filter = '*.*' # <-- set this according to your requirements
# STEP (1)
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{
IncludeSubdirectories = $false # <-- set this according to your requirements
NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
}
# Run python script, removing existing .pdf-files.
Write-Host "Running PS-script..."
start-process runrisk.bat -workingdirectory "H:\FX\"
# STEP (2)
$onCreated = Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
$path = $Event.SourceEventArgs.FullPath
$name = $Event.SourceEventArgs.Name
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated
# STEP (3)
# Call sendMail.ps1 to send mail confirmation
invoke-expression -Command .\sendMail.ps1
Write-Host "The file '$name' was $changeType at $timeStamp `r"
# Print file
start-process outputfile.pdf -workingdirectory "X:\folder1" -verb Print
# STEP (4)
# unregister current subscription
Unregister-Event -SourceIdentifier FileCreated
}
我在这个脚本周围建了一个.exe文件。如果我直接从PowerShell运行这个.ps1文件,一切都可以正常工作:(1)在文件夹上创建监听器,(2)删除旧的.pdf文件并等待创建新的.pdf文件,(3)在创建事件上打印和发送邮件,(4)取消订阅监听器。
尝试运行.exe文件时,或者例如通过Windows任务计划程序运行ps1文件,它似乎只运行到STEP(2),即好像没有创建监听器,因此当bat文件创建.pdf文件完成时没有任何反应。它只是闪烁一些cmd窗口,就是这样。
任何想法都会非常感激!
谢谢, 尼古拉斯
答案 0 :(得分:0)
您的脚本执行Register-objectEvent,然后立即停止。因此,如果会触发任何事件,则不允许脚本等待足够长时间以查看与该触发器关联的任何操作。允许足够时间的一种方法是在脚本末尾添加这样的一行:
let writeStream = fs.createWriteStream('public/article_image/' + folder + '/' + "something.jpg");
writeStream.on('finish', () => {
console.log('resized image 16')
somefunction(16, true);
});
writeStream.on('error', (errr) => {
console.log('error occurred')
console.log(err)
});
gm('public/' + article.page.image)
.resize(width, height)
.quality(80)
.stream()
.on('error', (err) => {
console.log('read stream err', er)
})
.pipe(writeStream);
上面一行让您的脚本等待任何触发器发生并执行操作。请参阅this article上的示例。
在交互式PowerShell窗口中执行脚本时,注册事件侦听器在脚本终止后仍然存在,但只要您保持窗口打开即可。可能这会让你看到行动发生。但是,只要关闭窗口,eventlistener就会自动取消注册,不会采取任何操作。
我不知道创建一个可执行文件是如何改变这种行为的,但当然,据我所知,你创建的exe也会立即终止并且不会等待事件被触发,这不是正确的行为从您的脚本中获取任何结果。