Powershell VMWare 脚本未从计划任务运行

Powershell VMWare 脚本未从计划任务运行

背景/目标

我正在尝试创建一个计划任务,它将:

  • 在指定时间运行(一次)
  • 运行 PowerShell 脚本:
    • 将所有输出记录为记录稿
    • 使用加密的存储凭证连接到我的 vCenter 服务器
    • 关闭特定文件夹中所有虚拟机的客户操作系统

问题

该脚本从控制台完美执行但甚至没有开始作为任务执行。

代码

#Stop an error from occurring when a transcript is already stopped
$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null

#Reset the error level before starting the transcript
$ErrorActionPreference="Continue"
Start-Transcript -path C:\temp\Shutdown_NonProductionVMs.log -append

#Add the VMWare Snap-in
Add-PSSnapin -Name VMWare.VimAutomation.Core

#Get the Credentials
$creds = Get-VICredentialStoreItem -file  C:\temp\pscreds.creds

#Connect to the server using the credentials file
Connect-VIServer -Server $creds.host -User $creds.User -Password $creds.Password

#Get all VMs within the non-production VMs folder and then shut them down
#NOTE the -WhatIf tag, which will stop it from shutting down the VMs until we're sure the script is good.

Get-Folder -Name "03. Non-Production VMs" | Get-VM | Shutdown-VMGuest -WhatIf

#Clean Up
Disconnect-VIServer -Force -Confirm:$false
Remove-PSSnapin -Name VMWare.VimAutomation.Core
Stop-Transcript

到目前为止我已经检查/尝试过的内容以及其他线索

  • 再次,当以管理员身份打开控制台时,此脚本可以在控制台中完美运行。
  • 我已经设置了“不受限制”的机器级执行策略,看看是否有帮助。
  • 我以创建凭证文件时使用的同一用户身份运行该任务
  • 我正在以最高权限运行该任务。
  • 我正在使用存储的凭据(我的用户凭据 - 与控制台上使用的凭据相同)运行该任务。
  • 我尝试注释掉与成绩单相关的代码,看看是否能起到作用;但没有成功。
  • 任务只是继续永久运行。我没有得到任何结果,它也没有终止。

有什么想法吗?提前感谢您提供的任何帮助!

答案1

如果您在交互式“控制台”会话中启动 Powershell,则您很可能会启动 64 位版本的 Powershell。(可执行文件将驻留在 Windows\System32 中。)您还可以通过执行驻留在 Windows\SysWOW64 中的版本从 64 位 Windows 启动 32 位 Powershell。确保您知道任务计划程序正在启动哪个版本。

请记住,每个版本的 Powershell 都有完全独立的执行策略。因此,您需要设置两次执行策略,以覆盖 32 位和 64 位版本的 Powershell。

您尝试加载的管理单元也可能很关键。某些管理单元和 COM 对象只能在 32 位或 64 位环境中加载。但是,我刚刚在安装了 PowerCLI 的 Server 2008 R2 服务器上进行了测试,在两种环境中加载您引用的管理单元都没有问题。所以我认为这不是问题所在。但这仍然是需要考虑的问题。它可能取决于您安装的 PowerCLI 版本。确保管理单元从 32 位和 64 位 PS shell 加载。

最后,您能告诉我们计划任务中的操作屏幕具体说了什么吗?您正在运行什么命令行(带参数)?如果您运行类似下面的命令,您可能会获得更多调试信息cmd /c powershell.exe c:\yourscript.ps1 2>&1> C:\debug.txt

Get-ExecutionPolicy -List它也可能会帮助我们提供来自 32 位和 64 位环境的输出。

您还在帖子中提到:

任务只是继续永久运行。我没有得到任何结果,它也没有终止。

这通常表示它正在等待用户输入。

编辑:错别字,到处都是错别字

相关内容