2017-09-23 114 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

相关问题