首页 > 解决方案 > 执行后不释放批处理脚本

问题描述

我有一个批处理脚本,它在发生备份事件后执行文件版本控制。此批处理脚本写入普通的 txt 日志文件,调用 PowerShell 脚本将此日志文件作为附件发送,并带有成功通知电子邮件。我已设法释放日志文件的写入锁定,以允许 PS 附加并发送文件,但批处理脚本在整个序列完成后不会停止。

当我检查日志文件时,我看到 shell 实例在脚本中放置了一个“暂停”,而不是自终止(按照指示),并导致:

  1. Press any key to continue...带着等待的外壳
  2. 一个应用程序锁定的日志文件,它不允许脚本再次运行,除非日志文件被释放。

这是事件的顺序: 脚本序列 我唯一的暂停是在 < bak_send_exec.bat > - 它的唯一目的是启动一个 PS 脚本:

PowerShell.exe -noprofile -executionpolicy bypass

如果我删除它,PS 不会启动。如果我把它放在那里,PS 会启动并完美执行,但日志文件会锁定在处于暂停状态的 shell 实例中,直到有人杀死锁定文件的 cmd.exe 实例。

这在周末上午 01:00 运行,因此不需要用户干预。

VC 脚本总结:


这个相互连接的批处理文件用时间戳重命名两个相同的文件(在不同的位置)。时间戳被写入变量以用于通知电子邮件,该电子邮件使用 PowerShell 命令发送。整个过程被记录到一个 txt 日志文件中(当脚本再次运行时文件被覆盖),并且该日志文件包含在前面提到的通知电子邮件中。

脚本调用:


初始启动命令:触发版本控制程序并记录进度versioncontrol_post.bat > TSLog.txt 2>&1

versioncontrol_post.bat:执行主程序,然后以CALL bak_send_exec.bat

bak_send_exec.bat:怀疑的原因...整个文件的编码长三行,但如前所述,为了放松政策,这是必需的:

@ECHO OFF
PowerShell.exe -noprofile -executionpolicy bypass -file bak_send.ps1
PAUSE

bak_send.ps1:执行主要过程将临时日志 (TSLog.txt) 复制到其最终主页,释放 TSLog 文件以使用它的新副本,并继续获取新副本并将其附加到电子邮件并发送电子邮件。该过程的最后一行是EXIT.


故障查找告诉我问题不在于 PowerShell 脚本,而在于调用它的脚本。取出 PAUSE 命令会导致 PowerShell 无法启动。

有没有人对此“功能”有可能的解决方案?

标签: powershellbatch-file

解决方案


推荐阅读