2017-09-23 43 views
0

我正在嘗試將.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腳本名爲.psl(不移動文件):

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:

我現在已決定逐行運行命令: 在我開始之前,我只在我的語法文件夾中有兩個文件: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%。它接近彷彿它複製文件。這些文件不會從文件夾語法中移出,但會被複制到Generated文件夾中。

也許問題在於命令Move並未等待Start-Process命令完成。

這裏是一個調試點作爲在評論中建議設置: enter image description here

+1

你已經把'-Destination'爲'移動-Item'的下一行,但現在您的腳本已經在您的原始文章之外進行了編輯,我不知道@Ansgar是否已解決您的問題。重新發布前請重新嘗試。 – Compo

+0

首先,批處理腳本啓動2個Java進程,而您的PowerShell腳本僅啓動(或嘗試啓動)只有一個組合了所有參數的腳本。您是否驗證過要移動的文件是否正確生成?你究竟「在」Move-Item'命令中「如何?」? –

+0

@compo嗯......我期望解析器認識到命令在下一行繼續,因爲只有參數被包裝,但顯然它不在這種情況下。恢復該修復。 –

回答

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

相關問題