静音蝙蝠文件执行powershell命令

时间:2020-10-23 21:39:21

标签: powershell batch-file windows-server-2016 failover

我们有一个作为服务运行的应用程序服务器,在加载某些配置后,它将启动一个bat脚本,该脚本必须运行powershell命令Stop-ClusterGroup DRMSERVICES,然后再次启动它。 当我通过单击dobbelt手动执行bat文件时,bat文件可以正常工作。但是,当服务运行bat时,它不会完成或执行powershell命令。

蝙蝠文件如下

@echo off

powershell -command Stop-ClusterGroup DRMSERVICES

powershell -command Start-ClusterGroup DRMSERVICES

该服务以静默方式运行bat文件,这是主要区别。 我尝试使用各种开关,包括-ExecutionPolicy UnrestrictedSTART /wait等 创建一个单独的ps1文件,然后让bat代替它执行。 全部具有相同的输出: 手动执行蝙蝠作品 当服务执行蝙蝠时,它不起作用。

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

在powershell事件查看器中,我还可以看到发生了powershell命令的事件。 在事件查看器中手动执行和让服务执行命令之间的区别是事件ID 800,该事件ID声明了有关“执行管道”的信息,该信息在服务执行蝙蝠时不存在。

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

无论是权限问题,语法错误还是其他原因,我都很失落。

希望有人可以提供帮助

更新: 我已经尝试了所有建议的解决方案,所有解决方案都具有相同的结果,双击该bat文件即可使用,但是该服务无法执行powershell命令。因为我可以通过管道传输到txt文件,所以执行了纯cmd。尝试运行时,我什至发现输出日志文本写了“插入管理员密码”

我什至设法让我们的软件专家将我们的软件更改为直接调用Powershell而不是蝙蝠,结果相同。 Powershell不会执行命令,这告诉我可能是权限,但是为了成功,一切都已设置为以admin身份登录并以admin身份运行,但是仍然没有。

2 个答案:

答案 0 :(得分:0)

我认为我在处理之前,之后都已经处理过此类问题

powershell -command Stop-ClusterGroup DRMSERVICES

您需要让cmd等待一定的秒数,然后测试DRMSERVICES现在是否已停止,如果已停止,则再次启动DRMSERVICES。这样,cmd将保持等待状态,然后检查服务是否已停止。 经过一定次数的尝试后,也许有一种方法可以停止检查并退出脚本,例如,它试图停止服务,并遇到了问题。

cmd中有一个超时命令

答案 1 :(得分:0)

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

请注意,sysnative文件夹仅在32位会话中可见,因此无法通过在64位操作系统上浏览找到。