静默bat文件执行powershell命令

Silent bat file execute powershell command

我们有一个应用程序服务器 运行ning 作为服务,当加载某些配置时它会启动一个 bat 脚本,该脚本必须 运行 powershell 命令 Stop-ClusterGroup DRMSERVICES 然后启动它再次。 当我通过 dobbelt 单击手动执行时,bat 文件可以完美运行。但是服务在运行ning bat的时候,并没有结束,还是执行了powershell命令。

bat文件如下所示

@echo off

powershell -command Stop-ClusterGroup DRMSERVICES

powershell -command Start-ClusterGroup DRMSERVICES

服务运行是静默模式下的bat文件,这是一个主要区别。 我尝试了各种开关,包括 -ExecutionPolicy UnrestrictedSTART /wait 等 创建一个单独的 ps1 文件并让 bat 执行它。 全部具有相同的输出: 手动执行 bat works 服务执行bat时,没有生效

我知道 bat 文件是由服务执行的,因为插入 NET STOP servicename 工作正常。

在 powershell 事件查看器中,我还可以看到 powershell 命令的事件发生。 手动执行和让服务在事件查看器中执行命令之间的区别是事件 ID 800,它说明了有关 'execution pipe' 的信息,当服务执行 bat 时,这不存在。

该服务不等待 powershell,因此它没有时间在退出前停止集群。

我不知道这是权限问题、语法错误还是其他问题。

希望有人能帮忙

更新: 我尝试了所有建议的解决方案,结果都相同,双击时 bat 文件有效,但该服务不执行 powershell 命令。执行纯 cmd,因为我可以通过管道传输到 txt 文件。我什至在尝试 运行 时遇到了一个问题,因为输出日志文本写着“插入管理员密码”

我什至设法让我们的软件人员更改我们的软件以直接调用 powershell 而不是 bat,结果相同。 Powershell 不会执行命令,这告诉我它可能是权限,但为了成功,一切都已设置为以管理员身份登录和 运行 以管理员身份登录,但仍然没有。

我想我之前和之后都处理过这种问题,

powershell -command Stop-ClusterGroup DRMSERVICES

您需要让 cmd 等待一定秒数,然后测试 DRMSERVICES 现在是否停止,如果停止则再次启动 DRMSERVICES。这样cmd会一直等待,然后检查服务是否已经停止。 经过一定次数的尝试后,也许有办法停止检查并退出脚本,例如它正在尝试停止服务,并且 运行 出现问题。

cmd中有一个timeout命令

我解决了这个问题。 因为该服务是一个 32 位进程,它会执行一个 32 位的 powershell。 FailoverClusters 模块仅作为 64 位模块存在。 通过使用 %SystemRoot%\sysnative\WindowsPowershell\v1.0\powershell.exe 该服务能够打开 64 位会话,从而使用故障转移群集模块。

附带说明一下,sysnative 文件夹仅在 32 位会话中可见,因此无法通过在 64 位中浏览找到它 os。