Windows 任务计划程序中的 PowerShell 脚本无法正常工作

编程入门 行业动态 更新时间:2024-10-22 18:37:01
本文介绍了Windows 任务计划程序中的 PowerShell 脚本无法正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

概述:我有一个脚本,用于通过 WMI 在 SCCM 中查询新的应用程序请求.该脚本在 PowerShell 控制台中手动启动时完美运行(无论是否提升,都没有关系).我需要通过任务计划程序运行脚本.当前设置为使用管理员凭据运行,并且选中了以最高权限运行"复选框.

Overview: I have a script I am using to query new application requests within SCCM via WMI. The script works perfectly when launched manually within a PowerShell console (either elevated or not, doesn't matter). I need to run the script through Task Scheduler. Currently set up to run with admin credentials and the checkbox for 'Run with highest privileges' is checked.

问题:无法从 Windows Server 2008 R2 中的任务计划程序正确运行.没有报告错误(任务调度程序返回错误代码 0)但它似乎没有继续阅读以下行:

The Issue: Won't run correctly from Task Scheduler within Windows Server 2008 R2. No errors are reported (task scheduler returns error code of 0) but it doesn't seem to proceed past the line that reads:

$GetAppRequest = Get-WmiObject -Class SMS_UserApplicationRequest -Namespace root/SMS/site_$SiteCode | Where-Object {$_.CurrentState -like "1"} | ForEach-Object {

这里是完整的脚本:

#Hard-coded variables $SiteCode = "MySiteCode" $ComputerName = "My-SCCM-Server" $GUIDFilePath = "C:\Scripts\SCCM\GUIDList.txt" $FilePath = "C:\Scripts\SCCM" $smtpServers = "smtp1.domainname","smtp2.domainname" $reliableSmtpServer = $null $logpath = "C:\Scripts\SCCM\RequestLog.txt" #logging functionality function log($message, $type){ $date = get-date $string = "$date $type : $message" | Out-File $logpath -Append } #does log exist? if (gi -Path $logpath -ErrorAction SilentlyContinue){ #yep, the log exists! $logContent = cat $logpath log -message "Script called and log opened for writing." -type "Info" } else { #nope, the log doesn't exist, let's make one. write "Can't find log file, creating a new one." $newFileResult = New-Item -Path $logpath -ItemType File -ErrorAction Stop if ($newFileResult.Exists){ log -message "new log file created" -type "Info" } #end if } #end else #Email variables $from = "no.reply@domainname" $to = "sccm-admin@domainname" $subject = "New SCCM Application Approval Requests" #Determine which SMTP to use. $smtpServers | ForEach-Object { if ($reliableSmtpServer -eq $null){ if (Test-Connection -ComputerName $_ -ErrorAction SilentlyContinue){ write "Reliable SMTP server found: $_" $reliableSmtpServer = $_ } #end if test-connection } #end if reliableSmtpServer exists } #end foreach SMTP server if ($reliableSmtpServer){ log -message "Reliable SMTP server found, $reliableSmtpServer" -type "Info" } else { log -message "No reliable SMTP server could be found" -type "Error" } #Get the entries from GUIDList.txt if ($GetGUID = Get-Content -Path $GUIDFilePath -ErrorVariable guidReadError { write "Successfully read $GUIDFilePath" log -message "Successfully read $GUIDFilePath" -type "Info" } else { Write-Error -Message "Couldn't read GUIDfile..." log -message "Failed to read GUIDFile" -type "Error" } #Get all Application Requests with a CurrentState of "1" log -message 'Attempting to get all Application Requests with a CurrentState of 1' -type "Info" $GetAppRequest = Get-WmiObject -Class SMS_UserApplicationRequest -Namespace root/SMS/site_$SiteCode | Where-Object {$_.CurrentState -like "1"} | ForEach-Object { log -message "App found, $_.Application" -type "Info" if ($GetGUID -contains $_.RequestGuid) { Write-Host "Application request $($_.RequestGuid) already present" log -message "Application request $($_.RequestGuid) already present" -type "Info" } else { $appUser = $_.User $appName = $_.Application $appComment = $_.Comments $Body = @" Application request: $appName User: $appUser Comment: $appComment "@ #This row can't contain any blank spaces or tabs log -message "New record found: $appUser, $appName, $appComment" -type "Info" #Email configuration Send-MailMessage -SmtpServer $reliableSmtpServer -From $from -To $to -Subject $subject -Body $body -ErrorVariable mailError if (!($mailError)){ write "Message successfully sent to : $to" log -message "Message successfully sent to : $to" -type "Info" } else { Write-Error -message "Failed to send email!" log -message "Failed to send email!" -type "Error" } #end else #Append the current objects GUID to GUIDList.txt Write "Appending $($_.RequestGUID) to $GUIDFilePath" log -message "Appending $($_.RequestGUID) to $GUIDFilePath" -type "Info" $_.RequestGuid | Out-File $GUIDFilePath -Append } #end else statement } #end forEach #Remove the GUIDList.txt file and re-create it when there's more than 100 entries $GUIDCount = $GetGUID.Count if ($GUIDCount -gt 100) { log -message "Greater than 100 GUID entries, clearing list." -type "Info" Get-Item $GUIDFilePath | Remove-Item New-Item -Path $FilePath -Name GUIDList.txt -ItemType file } #Create a new log once the log file exceeds 1000 lines. $logCount = $logContent.Count if ($logCount -gt 1000) { log -message "Log file is too long, removing log" -type "Warning" Remove-Item $logpath }

这是计划任务 XML:

<?xml version="1.0" encoding="UTF-16"?> <Task version="1.3" xmlns="schemas.microsoft/windows/2004/02/mit/task"> <RegistrationInfo> <Date>2014-05-09T17:10:48.6636926</Date> <Author>domainname\myUserAccount</Author> <Description>Runs a script located at C:\scripts\SCCM to determine if there are any new application requests and notify IT staff via Email.</Description> </RegistrationInfo> <Triggers> <TimeTrigger> <Repetition> <Interval>PT15M</Interval> <StopAtDurationEnd>false</StopAtDurationEnd> </Repetition> <StartBoundary>2014-05-09T17:12:04</StartBoundary> <ExecutionTimeLimit>PT1H</ExecutionTimeLimit> <Enabled>true</Enabled> </TimeTrigger> </Triggers> <Principals> <Principal id="Author"> <UserId>domain\AdminAccount</UserId> <LogonType>Password</LogonType> <RunLevel>HighestAvailable</RunLevel> </Principal> </Principals> <Settings> <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries> <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries> <AllowHardTerminate>true</AllowHardTerminate> <StartWhenAvailable>false</StartWhenAvailable> <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable> <IdleSettings> <StopOnIdleEnd>true</StopOnIdleEnd> <RestartOnIdle>false</RestartOnIdle> </IdleSettings> <AllowStartOnDemand>true</AllowStartOnDemand> <Enabled>true</Enabled> <Hidden>false</Hidden> <RunOnlyIfIdle>false</RunOnlyIfIdle> <DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession> <UseUnifiedSchedulingEngine>false</UseUnifiedSchedulingEngine> <WakeToRun>false</WakeToRun> <ExecutionTimeLimit>P3D</ExecutionTimeLimit> <Priority>7</Priority> </Settings> <Actions Context="Author"> <Exec> <Command>powershell.exe</Command> <Arguments>-noprofile -file "C:\scripts\sccm\Notify.ps1"</Arguments> </Exec> </Actions> </Task>

推荐答案

您的意思是要分配 Get-WmiObject ... | 的结果吗?Foreach-Object { 行到 $GetAppRequest 变量?我的意思是 Foreach-Object 循环的输出被该赋值捕获,这看起来不是故意的,因为您不再使用该变量.

Did you mean to assign the results of the Get-WmiObject ... | Foreach-Object { line to the $GetAppRequest variable? What I mean is that the output of the Foreach-Object loop are being caught by that assignment which doesn't look intentional since you don't use that variable again.

我建议您对变量执行赋值,然后将变量分别传递给 Foreach-Object cmdlet,并在两者之间进行一些登录.此外,我们可以将 Get-WmiObject 包装在 try{}catch{} 构造中以捕获 cmdlet 可能抛出的任何错误;为了确保错误被​​捕获,我们设置 -ErrorAction Stop:

I'd suggest that you perform the assignment to the variable then pass the variable to the Foreach-Object cmdlet separately with some logging in between. Also, we could wrap the Get-WmiObject in a try{}catch{} construction to capture any errors the cmdlet might throw; to ensure the error is caught, we set -ErrorAction Stop:

try { $GetAppRequest = Get-WmiObject -Class SMS_UserApplicationRequest -Namespace root/SMS/site_$SiteCode -ErrorAction Stop } catch { log -message "Get-WmiObject cmdlet failed" -type "Error" log -message $_.Exception.Message.ToString() -type "Error" } if(-not $GetAppRequest) { log -message "Failed to retrieve WMI data" -type "Error" } elseif(-not ($GetAppRequest = $GetAppRequest | Where-Object {$_.CurrentState -like "1"})) { log -message "No results with CurrentState = 1" -type "Info" } $GetAppRequest | ForEach-Object { ...

更多推荐

Windows 任务计划程序中的 PowerShell 脚本无法正常工作

本文发布于:2023-11-05 07:55:32,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1560291.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:无法正常   脚本   计划   程序   工作

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!