运行 Cmd.exe 后 Powershell 不会退出

Posted

技术标签:

【中文标题】运行 Cmd.exe 后 Powershell 不会退出【英文标题】:Powershell Won't Exit After Running Cmd.exe 【发布时间】:2021-12-30 16:05:30 【问题描述】:

我正在使用 powershell 来

    关闭访问数据库, 将更新的 Access 前端下载到本地计算机, 更新(覆盖)本地文档,以及 使用 cmd.exe 启动带参数的 Access 数据库。

一切正常,但使用cmd.exe 命令启动数据库后Exit 命令不起作用。

如果我注释掉cmd.exe 命令,那么Exit 命令就可以正常工作。但如果我使用Exit 命令,脚本会停在那里,Exit 命令不起作用。下面是我正在谈论的整个代码。

## Close Microsoft Access
Stop-process -name MSACCESS -Force

## Download updated Access database to local machine
Copy-Item "F:\New_DB\Win7DBDocs\WC_Sys.mdb" -Destination "C:\DB_Docs" -Recurse -Force

## Copy Documents and Spreadsheets to local machine
echo "Overwriting files C:\DB_WPDocs"
Copy-Item -Path "F:\New_DB\DB_WPDocs\*" -Destination "C:\DB_WPDocs" -Recurse -Force

## Launch Microsoft Access with Parameters
cmd.exe /c "C:\Program Files (x86)\Microsoft Office\root\Office16\MSACCESS.EXE" "C:\DB_Docs\WC_Sys.mdb" /WRKGRP "F:\DB_Docs\Secured.mdw"

Exit

【问题讨论】:

我会说,当用户的应用程序可能处于中途时,强制关闭用户应用程序可能是个坏主意,这会导致记录完成一半,并可能导致损坏。更好的是使用运行副本然后启动应用程序的快捷方式。这意味着每次打开数据库时,他们都会从服务器复制最新版本(并且应该压缩此版本以提高性能)。 用户自己将通过按下“Access 更新”按钮,在他们自己的 Access 数据库本地前端从 VBA 调用此脚本。我不时将更新推送到前端并发布公司范围内的通知以更新他们的应用程序。他们知道该按钮将关闭 Access 应用程序,运行更新,然后在他们的计算机上再次打开。此外,更新会自动在网络登录脚本上运行,因此无论哪种方式都涵盖了它们。 【参考方案1】:

cmd.exe 将阻塞直到MSACCESS.EXE 退出。

要让cmd.exe 启动程序并立即返回,请使用start 命令:

cmd.exe /c start "C:\Program Files (x86)\Microsoft Office\root\Office16\MSACCESS.EXE" "C:\DB_Docs\WC_Sys.mdb" /WRKGRP "F:\DB_Docs\Secured.mdw"

... 或完全删除 cmd.exe 并改用 Start-Process cmdlet:

Start-Process "C:\Program Files (x86)\Microsoft Office\root\Office16\MSACCESS.EXE" -ArgumentList "C:\DB_Docs\WC_Sys.mdb", /WRKGRP, "F:\DB_Docs\Secured.mdw"

【讨论】:

以上是关于运行 Cmd.exe 后 Powershell 不会退出的主要内容,如果未能解决你的问题,请参考以下文章

从PowerShell设置Visual Studio环境变量

如何让 Powershell 运行批处理文件然后保持打开状态?

Powershell -Window下比cmd.exe更具可读性易用性可面向对象的命令行客户端

cmd.exe --> powershell.exe "-File" 和 "-Command" 在同一行

使用 cmd.exe 或 PowerShell 或 Python 从 Windows 命名管道中读取

Shell、CMD、PowerShell、Bash