我们有一个作为服务运行的应用程序服务器,在加载某些配置后,它将启动一个bat脚本,该脚本必须运行powershell命令Stop-ClusterGroup DRMSERVICES
,然后再次启动它。
当我通过单击dobbelt手动执行bat文件时,bat文件可以正常工作。但是,当服务运行bat时,它不会完成或执行powershell命令。
蝙蝠文件如下
@echo off
powershell -command Stop-ClusterGroup DRMSERVICES
powershell -command Start-ClusterGroup DRMSERVICES
该服务以静默方式运行bat文件,这是主要区别。
我尝试使用各种开关,包括-ExecutionPolicy Unrestricted
和START /wait
等
创建一个单独的ps1文件,然后让bat代替它执行。
全部具有相同的输出:
手动执行蝙蝠作品
当服务执行蝙蝠时,它不起作用。
我知道bat文件是由服务执行的,因为插入NET STOP servicename
可以正常工作。
在powershell事件查看器中,我还可以看到发生了powershell命令的事件。 在事件查看器中手动执行和让服务执行命令之间的区别是事件ID 800,该事件ID声明了有关“执行管道”的信息,该信息在服务执行蝙蝠时不存在。
该服务不会等待Powershell,因此它没有时间在退出集群之前停止集群。
无论是权限问题,语法错误还是其他原因,我都很失落。
希望有人可以提供帮助
更新: 我已经尝试了所有建议的解决方案,所有解决方案都具有相同的结果,双击该bat文件即可使用,但是该服务无法执行powershell命令。因为我可以通过管道传输到txt文件,所以执行了纯cmd。尝试运行时,我什至发现输出日志文本写了“插入管理员密码”
我什至设法让我们的软件专家将我们的软件更改为直接调用Powershell而不是蝙蝠,结果相同。 Powershell不会执行命令,这告诉我可能是权限,但是为了成功,一切都已设置为以admin身份登录并以admin身份运行,但是仍然没有。
答案 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位操作系统上浏览找到。