2017-03-20 29 views
0

FileWatcher用のPowerShellスクリプトを作成しました。私はC#でそれを実行する必要があります。私はいろいろ試しましたが、うまくいかなかったのです。私はスクリプトを実行するバッチファイルも作成しました。まだそれは動作していない、単にコンソールが開いたり閉じたりする。コマンドプロンプトで手動で各ステップを実行すると、スクリプトを実行することができました。以下はCMDモードで実行するバッチファイルからPowerShellスクリプトを実行できません

私のPowerShellスクリプトである:ここで

$folder = 'D:\' 
$filter = '*.csv' 
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{ 
    IncludeSubdirectories = $false; 
    NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite' 
} 
Register-ObjectEvent $fsw Changed -SourceIdentifier FileChanged -Action { 
    $name = $Event.SourceEventArgs.Name 
    $changeType = $Event.SourceEventArgs.ChangeType 
    $timeStamp = $Event.TimeGenerated 
    Write-Host "The file '$name' was $changeType at $timeStamp" -Fore red 
    Out-File -FilePath D:\outp.txt -Append -InputObject "The file '$name' was $changeType at $timeStamp" 
} 

は、PowerShellのからスクリプトを呼び出すために、バッチファイル

D: 
powershell.exe 
powershell Set-ExecutionPolicy RemoteSigned 
./FileWatcherScript 
+1

PowerShellスクリプトをC#から実行する必要がありますが、質問にC#コードはありません。 –

+0

Ansgar Wiechers、ご返信ありがとうございます。 私のバッチファイルが機能するならば、私は自分でC#を試すことができます。 –

+6

バッチファイルが意味をなさない。最初の 'powershell.exe'は返さずにPowerShellを起動するので、手動で終了するまで他のコマンドは実行されません。それでも2番目のコマンドは実行ポリシーを設定して戻りますが、最後のステートメントは現在の作業ディレクトリからの最初のファイル拡張子 '%PATHEXT%'を持つファイル 'FileWatcherScript'を実行しようとします。 '.ps1'はこれらの拡張子の中にはないので、単にコマンドが見つからないというエラーが発生します。おそらく実行したいのは 'powershell.exe -ExecutionPolicy Bypass -File。\ script.ps1'です。 –

答えて

0

である、あなたは-File引数を使用する必要があります。あなたのポストでのバッチスクリプトのように、常に対話的なシェルを起動し、任意の引数を渡さず

powershell.exeを開始
powershell.exe -ExecutionPolicy RemoteSigned -File D:\FileWatcherScript.ps1 

:あなたが必要とするすべてがこの1行である - 私はこのような何かを見て、あなたのバッチファイルを変更したいです手動で終了する必要があります。プログラムでPowershellでコマンドを実行し、終了したら終了するには、上記のように-File引数を渡すか、文字列またはスクリプトブロックを取る-Command引数を渡すことができます。ここでは、文字列を取る-Command引数の短い例です:呼び出しは、2つの異なるURLを上の二回呼び出し-RestMethodを呼び出し、あなたが次々に実行するために、セミコロン(;)でコマンドを区切ることができることを実証し

powershell.exe -Command "Invoke-RestMethod https://example.com/api/do/thing; Invoke-RestMethod https://example.com/api/stop/otherthing" 

-Commandにスクリプトブロックを渡すこともできますが、これは別のPowershellセッション内からののみが機能することに注意してください。これは次のようになります。

powershell.exe -Command { Invoke-RestMethod https://example.com/api/do/thing; Invoke-RestMethod https://example.com/api/stop/otherthing } 

この呼び出しは前のものと同じことを行います。相違点は、スクリプトブロックを使用しているということです.Powershellのコンストラクトです。これは、親シェルもPowershellの場合にのみ機能します。文字列の引用の問題が少なくなるため、少し上手くなります。

関連する問題