2017-09-23 24 views
0

I .cmdバッチファイルをPowerShellの.ps1ファイルに書き直そうとしています。しかし、私はMove-Itemコマンドで失敗しています。なぜかわかりません。誰かが正しい方向に私を向けることができますか?異なる拡張子のファイルを一度に移動

バッチ(すべてが正常に動作します)ファイル.CMD:

cd ../Grammar 
java -jar ..\Tools\antlr-4.7-complete.jar ClarionLexer.g4 -Dlanguage=JavaScript 
java -jar ..\Tools\antlr-4.7-complete.jar ClarionExprParser.g4 -visitor -no-listener -Dlanguage=JavaScript 
MOVE /Y *.js ..\JavaScript\src\Generated 
MOVE /Y *.tokens ..\JavaScript\src\Generated 
cd ../JavaScript 

のPowerShell .ps1というスクリプト(ファイルを移動しない):

Set-Location -Path ..\Grammar -PassThru 
Start-Process java.exe -ArgumentList '-jar', '..\Tools\antlr-4.7-complete.jar ClarionLexer.g4 -Dlanguage=JavaScript ClarionExprParser.g4 -visitor -no-listener -Dlanguage=JavaScript' 

Get-ChildItem -Recurse -Path ..\Grammar | Where {($_.Extension -eq '.js') -or ($_.Extension -eq '.tokens')} | Move-Item -Destination ..\JavaScript\src\Generated 
Set-Location ../JavaScript -PassThru 

#Read-Host -Prompt "Press Enter to exit" 

UPDATE:

I 私が起動する前に私は文法フォルダしか持っていません2ファイル:ClarionExprParserおよびClarionLexer。

Set-Location -Path ..\Grammar -PassThru 
Start-Process java.exe -ArgumentList '-jar', '..\Tools\antlr-4.7-complete.jar ClarionLexer.g4 -Dlanguage=JavaScript ClarionExprParser.g4 -visitor -no-listener -Dlanguage=JavaScript' 

私は私の文法フォルダになりましたさらに、次のファイルがあります:ClarionExprParser.js、ClarionExprParser.tokens、ClarionExprParserVisitor.js、ClarionLexer.js、ClarionLexer.tokens 手段をこの部分のみを実行する

コマンドが正しく機能することを確認します。第二部を実行している

次へ:も正しく

Get-ChildItem -Recurse -Path ..\Grammar | Where {($_.Extension -eq '.js') -or ($_.Extension -eq '.tokens')} | Move-Item -Destination ..\JavaScript\src\Generated -Force 
Set-Location ../JavaScript -PassThru 

作品。

しかし、私はすべて一緒に置くと100%正しく動作しません。それはファイルをコピーするかのように縫う。ファイルは「文法」フォルダから移動されませんが、生成されたフォルダにコピーされます。

問題は、コマンドMoveがStart-Processコマンドを完了するのを待っていないことです。ここで

はコメントで提案されているように設定され、デバッグポイントです: enter image description here

+1

あなたは次の行に移動します '・Item'のための' -Destination'を入れていたが、 @Ansgarがあなたの問題を修正したかどうかは分かりません。再転記する前にもう一度お試しください。 – Compo

+0

バッチスクリプトは2つのJavaプロセスを開始しますが、PowerShellスクリプトはすべての引数を組み合わせて起動する(または開始しようとする)だけです。最初に移動するファイルが正しく生成されていることを確認しましたか?あなたは 'Move-Item'コマンドでどのくらい正確にあなたは病気ですか? –

+0

@compo Hmm ...パーザは、引数だけがラップされているので、コマンドが次の行に続くことを認識することを期待しましたが、明らかにこの場合はありません。そのフィックスアップを元に戻しました。 –

答えて

2

あなたがここにasynchronic問題を抱えているようです。
Javaプロセスを開始し、終了する前にファイルを移動しようとしています。
Javaプロセスが終了するまで待つことで解決できます。
notepad.exeを上の小さな例:あなたのコードのための

$myProcess = Start-Process notepad.exe -PassThru 

do{ 
    $myProcess = Get-Process -Id $myProcess.Id -ErrorAction SilentlyContinue 

}while($myProcess -ne $null) 

ソリューション:

Set-Location -Path ..\Grammar -PassThru 
$javaProcess = Start-Process java.exe -ArgumentList '-jar', '..\Tools\antlr-4.7-complete.jar ClarionLexer.g4 -Dlanguage=JavaScript ClarionExprParser.g4 -visitor -no-listener -Dlanguage=JavaScript' -PassThru 
do{ 
    $javaProcess = Get-Process -Id $javaProcess.Id -ErrorAction SilentlyContinue 

}while($javaProcess -ne $null) 

Get-ChildItem -Recurse -Path ..\Grammar | Where {($_.Extension -eq '.js') -or ($_.Extension -eq '.tokens')} | Move-Item -Destination ..\JavaScript\src\Generated 
Set-Location ../JavaScript -PassThru 
+0

これですべて正常に動作します。あなたは、すべてがうまくいけば私に成功メッセージを表示し、エラーがあれば失敗メッセージを表示するようにプログラムを作る方法を知っていますか? – Devid

+0

まず、何がうまくいかないかを決める必要があります。たとえば、 'Move-Item'が失敗して、' try {} catch {} 'コマンドを実行するかもしれません。また、Javaが作成しているファイルの名前がわかっている場合は、Javaの実行後にすべてのファイルが作成されたかどうかをチェックし、そうでない場合はエラーなどを送信する機能を作成できます。 – E235

関連する問題