脚本侦听文件夹事件Powershell

时间:2014-06-17 12:41:52

标签: windows powershell exe

我遇到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窗口,就是这样。

任何想法都会非常感激!

谢谢, 尼古拉斯

1 个答案:

答案 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也会立即终止并且不会等待事件被触发,这不是正确的行为从您的脚本中获取任何结果。