首页 > 解决方案 > 长时间运行任务后无法移动文件

问题描述

我有一个由 Windows 任务计划程序执行的 windows powershell 脚本。powershell 代码启动一个可执行的 cli 程序 (java),它创建它自己的日志文件,然后在完成后我的 powershell 脚本尝试重命名该文件,然后将其上传到远程服务器。但是,我发现它仅在第 3 次或第 4 次执行时才成功上传文件,但不知道为什么。任务调度程序中的历史记录没有提供关于可能发生的事情的详细信息(文件锁定?)。关于如何解决这个问题的任何想法?这是我正在做的一个基本示例:

$old_log_name = "old_logfilename"
$new_log_name = "new_logfilename"
C:\path\to\my-java-program.exe -pass -some -options
Move-Item -Path $old_log_name -Destination $new_log_name
gsutil cp $new_log_name gs://cool-bucket-with-cf

我确定问题在于重命名文件,而不是上传文件,因为可以在 Windows 文件资源管理器中看到。我应该检查文件是否可以重命名吗?

编辑(根据以下评论修改代码):

$app_version = "4.5.7"
$now = get-date
$now = $now.ToString("yyyyMMddhhmm")
$old_log_name = "D:\myapp_$app_version.log"
$new_log_name = "D:\myapp_servername_$app_version.$now.log"
$arguments = "-a -c C:\myapp\config\Stage-$app_version.xml"
Start-Process C:\myapp\bin\4.5.7\myapp.exe -ArgumentList $arguments -NoNewWindow -Wait
Move-Item -Path $old_log_name -Destination $new_log_name
gsutil cp $new_log_name gs://path-to-mybucket

标签: powershell

解决方案


你为什么不用你的java程序启动一个进程,让它等待它退出?

$old_log_name = "old_logfilename"
$new_log_name = "new_logfilename"
Start-Process C:\path\to\my-java-program.exe -ArgumentList "your options" -NoNewWindow -Wait
Move-Item -Path $old_log_name -Destination $new_log_name
gsutil cp $new_log_name gs://cool-bucket-with-cf

更新
由于这是一个计划任务,您需要添加一个新的事件日志以记录脚本中的事件(您需要管理权限):

New-EventLog -LogName Application -Source TheScriptThatCallsMyJavaProgram

然后,将Start-Processcall 替换为以下内容(EventId这里是随机的):

Write-EventLog -LogName Application -Source TheScriptThatCallsMyJavaProgram -EventId 3001 -Message "my-java-program.exe is about to start" # This logs the start of the program
$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.FileName = "C:\path\to\my-java-program.exe"
$pinfo.Arguments = "your options"
$p = New-Object System.Diagnostics.Process
$p.StartInfo = $pinfo
$p.Start() | Out-Null
$p.WaitForExit()
Write-EventLog -LogName Application -Source TheScriptThatCallsMyJavaProgram -EventId 3002 -Message "my-java-program.exe is exited" # This logs the end of the program

推荐阅读