背景/目标
我正在尝试创建一个计划任务,它将:
- 在指定时间运行(一次)
- 运行一个 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
到目前为止我检查/尝试过的内容和其他线索
- 同样,当以管理员身份打开控制台时,此脚本在控制台中运行得非常好。
- 我已经设置了“无限制”的机器级执行策略,看看是否有帮助。
- 我正在以创建凭据文件的同一用户身份运行任务
- 我正在以最高权限运行任务。
- 我正在使用存储的凭据(我的用户凭据——与控制台中的凭据相同)运行任务。
- 我试着注释掉与成绩单相关的代码,看看是否能做到;没有骰子。
- 该任务只是继续永久运行。我没有得到任何结果,也没有终止。
有任何想法吗?在此先感谢您提供的任何帮助!
如果您在交互式“控制台”会话中启动 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 位环境的输出。在你的帖子中你还提到:
这通常表示它正在等待用户输入。
编辑:错别字,错别字无处不在