静默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 Unrestricted
和 START /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。
我们有一个应用程序服务器 运行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 Unrestricted
和 START /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。