一次移动具有不同扩展名的文件

时间:2017-09-23 09:43:00

标签: powershell batch-file

我正在尝试将.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命令完成。

以下是注释中建议的调试点集: enter image description here

1 个答案:

答案 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