2017-11-15 10 views
0

ファイルが作成されるたびに外部psスクリプトを呼び出そうとしています。ファイルの監視とロギングは正常に機能しますが、外部スクリプトを実行するInvoke-Expressionは、ファイルがさらに作成された場合でも1回だけ実行されます。新しいファイルが作成されるたびに外部スクリプトを実行するにはどうすればよいですか。外部powershellスクリプトは、呼び出されたアクションが1回だけ実行されます

### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO 
    $watcher = New-Object System.IO.FileSystemWatcher 
    $watcher.Path = "c:\mypath" 
    $watcher.Filter = "*.txt*" 
    $watcher.IncludeSubdirectories = $true 
    $watcher.EnableRaisingEvents = $true 

### DEFINE ACTIONS AFTER AN EVENT IS DETECTED 
    $action = { $path = $Event.SourceEventArgs.FullPath     
       $changeType = $Event.SourceEventArgs.ChangeType 
       $logline = "$(Get-Date), $changeType, $path" 
       Add-content "C:\mypath\log.txt" -value $logline 
       Invoke-Expression (start powershell ("C:\MyOtherScript.ps1")) ###### This only runs one time even if file is changes and logged 
       } 

### DECIDE WHICH EVENTS SHOULD BE WATCHED 

    Register-ObjectEvent $watcher "Created" -Action $action 
    while ($true) {sleep 5} 

EDIT:これはここ

### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO 
    $watcher = New-Object System.IO.FileSystemWatcher 
    $watcher.Path = "c:\mypath" 
    $watcher.Filter = "*.txt*" 
    $watcher.IncludeSubdirectories = $true 
    $watcher.EnableRaisingEvents = $true 

### DEFINE ACTIONS AFTER AN EVENT IS DETECTED 
    $action = { $path = $Event.SourceEventArgs.FullPath     
       $changeType = $Event.SourceEventArgs.ChangeType 
       $logline = "$(Get-Date), $changeType, $path" 
       Add-content "C:\mypath\log.txt" -value $logline 
       Start-Process powershell -argument "C:\MyOtherScript.ps1" 
       } 

### DECIDE WHICH EVENTS SHOULD BE WATCHED 

    Register-ObjectEvent $watcher "Created" -Action $action 
    #while ($true) {sleep 5} 
+0

最後にループの目的は何ですか?また、なぜ 'Start-Process'の代わりに' Invoke-Expression'を使用していますか – TheIncorrigible1

+0

最後のループは、ファイルを監視する元のコードにあります。https://superuser.com/questions/226828/how-to-ファイルの作成時にフォルダの監視とトリガのコマンドラインアクション –

+0

これを行う方法を検索すると、 'Invoke-expression'または 'invoke-item'が見つかりました他のスクリプトを実行する方法。私はPowerShellを初めて使っています。 –

答えて

0

Invoke-Expression porblemを解決するためにお探しの方は、自分自身を見つける包み働いてしまったため、セキュリティ上の懸念に&を使用しての上にお勧めではありません。しかし、あなたの例では、Start-Process

Start-Process -FilePath 'powershell' -ArgumentList @('-File','"C:\MyOtherScript.ps1"') 
関連する問題