2017-04-11 16 views
1

ファイルが特定のディレクトリに作成されたときに何らかの命令をトリガーするこのPowerShellスクリプトがあります。 すべて正常に動作しますが、動作が完了した後はPowerShellを閉じることができません。 どうすればいいですか?powershellスクリプトを終了

### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO 
$watcher = New-Object System.IO.FileSystemWatcher 
$watcher.Path = "C:\Users\Autostrade\CartellaSFTP" 
$watcher.Filter = "*.*" 
$watcher.IncludeSubdirectories = $false 
$watcher.EnableRaisingEvents = $true 
$uscita = 0 

### DEFINE ACTIONS AFTER AN EVENT IS DETECTED 
$action = { $path = $Event.SourceEventArgs.FullPath 
      $changeType = $Event.SourceEventArgs.ChangeType 
      $logline = "$(Get-Date), $changeType, $path" 
      Add-content "C:\Users\Autostrade\PHP Script Dati Telepass\log.txt" -value $logline 
      # Set up references to executable and script 
      $PhpExe = "C:\PHP\php.exe" 
      $PhpFile = "C:\Users\Autostrade\PHP Script Dati Telepass\script.php" 

      # Create arguments from Script location 
      # usually php.exe is invoked from console like: 
      # php.exe -f "C:\path\myscript.php" 
      #$PhpArgs = '-f "{0}"' -f $PhpFile 

      # Invoke, using the call operator 
      $PhpOutput = & $PhpExe $PhpFile 
      PhpOutput 
      $uscita = 1 
      }  
### DECIDE WHICH EVENTS SHOULD BE WATCHED 
Register-ObjectEvent $watcher "Created" -Action $action 
#Register-ObjectEvent $watcher "Changed" -Action $action 
#Register-ObjectEvent $watcher "Deleted" -Action $action 
#Register-ObjectEvent $watcher "Renamed" -Action $action 
while (!$uscita) {sleep 5} 
exit 

私はしばらくの間、終了を停止すること「$ uscita」変数を使用してみましたが、それは働いていません。私はまた、終了コマンドのアクションの最後に置くことを試みたが、それはあまりにも働いていない

+1

'$のuscita = 1 ' - >' $使用:uscita = 1' –

+0

私は何を読み取ることができないんだけど... PowerShellは多少の誤差やすぐ近くを与える..試してみましたが、 – seb

+0

'exit'を削除し、PowerShellプロンプトからスクリプトを実行してください。 –

答えて

0

オフハンドあなたは2番目の最後の行がおそらく真を返すように見えるので、それは単にsleepコマンド。

これを試すと、最後のコマンドが正常に完了した場合はtrueを返します。

while (!$uscita) {write-output $?; sleep 5} 
+0

さて、私は試しました。私が監視している彼のディレクトリにファイルを挿入すると、それは私に "false"を与えます。しかし、ループは停止しません。それは継続して真を返す – seb

+0

それは意味をなさない、我々は近づいている。 $?直前のコマンドが成功した場合はtrue/falseを返します。今私は疑問に思っています:あなたは "それは私に"偽り "を与えると言っています、あなたは$ uscita $ trueを返します。 ($ uscita -eq $ falseを意味します)。 – primohacker

+0

投稿した回答が最良の方法であるかどうかはわかりません。 $ uscita = 1を設定する代わりに、$ uscita = $ trueを設定することを検討してください。それでは、トラブルシューティングのために - while(!$ uscita){write-output $ uscita;スリープ5}。これがまだ無限にループしている場合は、$ uscita = $ true行がヒットしないことを意味します。他の書き込み出力を$ actionブロック以上に置いて、どこに問題があるかを確認します。関数PhpOutputのトラブルシューティングを忘れないでください。予期せぬ動作により、$ uscitaが設定されない可能性があります。 – primohacker

0

このようにしてコードの最後の部分を編集しました。アクションの後、スクリプトは終了します。 ここでは、コードです:

while (!$uscita) { 
if($? -eq $false) { 
    exit 
    } 
sleep 5} 
関連する問題