powershell - 长时间运行任务后无法移动文件
问题描述
我有一个由 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
解决方案
你为什么不用你的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-Process
call 替换为以下内容(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
推荐阅读
- spring-data - Spring Data Rest Controller (EndPoint) 的 Spring AOP 切入点
- c# - 替换列表中的字符串时出现问题,这是循环中对象的属性
- flutter - 我无法在灵活小部件中添加列小部件,错误:无法将 Null 类型的值分配给 const 构造函数中 Widget 类型的参数
- python - 将多个 xml 文件转换为 .csv 时出现 NotADirectoryError
- wordpress - 视频与文字不同步
- amazon-web-services - Wix + GoDaddy 域 + 子域的 AWS ELB
- ionic-framework - Snapchat 与离子电容器共享
- node.js - 错误:767:在 '{ 在 macOS 中安装节点时出现意外令牌
- java - Java上的浮点数据类型没有给出正确的值
- ansible - 如何捕获和显示文件名