2017-10-18 28 views
1

当文件夹中创建文件时,需要触发命令行操作。 在我的情况下,当我创建n - 脚本启动的文件夹中的文件.cmdn - 次。 如何在我有多个创建的文件时仅启动.cmd脚本?如何在创建文件时监视文件夹并触发命令行操作

### SET FOLDER TO WATCH 
    $watcher = New-Object System.IO.FileSystemWatcher 
    $watcher.Path = "C:\fso" 
    $watcher.Filter = "*.xls" 
    $watcher.EnableRaisingEvents = $true 

### DEFINE ACTIONS AFTER AN EVENT IS DETECTED 
    $action = { Start-Process cmd.exe "/c D:\Users\xfirebg\Desktop\excel\append.cmd" 
       }  
### DECIDE WHICH EVENTS SHOULD BE WATCHED 
    Register-ObjectEvent $watcher "Created" -Action $action 
    while ($true) {sleep 20} 
+0

当您在一个目录中同时写入多个文件时,事件会一个接一个地发生。如果你没有对每个事件感兴趣,为什么不每隔n秒轮询目录。另一种解决方案是两个开始你的过程每n个事件,而不是每个事件。 – JPBlanc

+0

是的,如何做第二个解决方案? –

+0

第一个解决方案不是un option,因为cmd脚本将xls转换为pdf并将其移动到另一个文件夹(xls)。此用户再次在fso文件夹中创建xls文件后。所以在这个文件夹中我总是有pdf。 –

回答

0

以下是每n个事件而不是每个事件启动您的过程的方法。

我使用一个对象作为参数,我在每个调用中都会收到这个参数。

### SET FOLDER TO WATCH 
    $watcher = New-Object System.IO.FileSystemWatcher 
    $watcher.Path = "C:\temp" 
    $watcher.Filter = "*.tmp" 
    $watcher.EnableRaisingEvents = $true 

### DEFINE ACTIONS AFTER AN EVENT IS DETECTED 
    $action = { 
     Write-host "coucou $($event.MessageData.counter)"; 
     $event.MessageData.counter +=1 
     if ($event.MessageData.counter % 3 -eq 0){ 
     Write-host "Bingo !" 
     } 
    }  
### DECIDE WHICH EVENTS SHOULD BE WATCHED 
    $obj = [PSCustomObject]@{"counter" = 0} 
    Register-ObjectEvent $watcher "Created" -Action $action -SourceIdentifier "test" -MessageData $obj 
Wait-Event -SourceIdentifier "test" 
+0

感谢您的回复。这很有趣。但它不适合我的情况。如果用户复制文件夹中的一个或两个文件会怎么样?脚本不会启动。如果文件夹中有一个或多个文件,我需要脚本才能启动它。 –

+0

我的市长问题是。当.cmd脚本在短时间内多次启动时,它们互相冲突。我需要更多时间来完成.cmd脚本的工作 –

相关问题