我正在尝试将.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"
更新:
我现在决定逐行执行命令: 在开始之前,我在我的Grammar文件夹中只有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'
我现在在我的Grammar文件夹中还有以下文件: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%正确地工作。它接缝就像复制文件一样。文件不会从文件夹Grammar中移出,而是复制到Generated。文件夹中。
问题可能是Move命令没有等待Start-Process命令完成。
答案 0 :(得分:2)
这里似乎你有一个异步问题 你启动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