【发布时间】:2022-03-29 11:02:11
【问题描述】:
我正在寻找一个可以运行以禁用任务计划程序作业(内部禁用 .bat 文件)的 powershell 脚本,该脚本可以在我们提到脚本的时间戳之间禁用。使用 Powershell 脚本是否可行?
任何帮助表示赞赏!
【问题讨论】:
标签: powershell
我正在寻找一个可以运行以禁用任务计划程序作业(内部禁用 .bat 文件)的 powershell 脚本,该脚本可以在我们提到脚本的时间戳之间禁用。使用 Powershell 脚本是否可行?
任何帮助表示赞赏!
【问题讨论】:
标签: powershell
我将首先使用带有 CSV 格式输出的方便的 SCHTASKS 可执行文件来获取包含所有计划任务信息的对象:
$tasks = & SCHTASKS /Query /V /FO CSV | ConvertFrom-Csv
参数的神奇解码环:/Query 是操作,/V 是详细输出,/FO CSV 是输出格式。现在它在一个对象中,您可以轻松过滤以找到您正在寻找的任务:
$task = $tasks | ? { $_.TaskName -eq "My Batch File" }
这使得启用或禁用任务变得容易,再次使用 SCHTASKS 可执行文件:
& SCHTASKS /Change /DISABLE /TN "$Task.TaskName"
您可以使用相同的代码轻松地再次启用该任务,只需将 /DISABLE 替换为 /ENABLE。 SCHKTASKS 是一个非常强大的工具,可用于创建和操作计划任务。
参考:http://msdn.microsoft.com/en-us/library/windows/desktop/bb736357.aspx
【讨论】:
Please enter the run as password for server\userid 有没有办法可以绕过这一步并禁用任务?
在 Windows Server 2008 及更高版本中,您可以使用 SCHTASKS 或 COM 对象 Schedule.Service 以更加面向对象的方式操作任务。有关同时使用 SCHTASKS 和 Schedule.Service 的示例,请参阅 http://letitknow.wordpress.com/2011/05/20/create-scheduled-task-by-using-powershell/。任务计划程序的 COM 接口记录在 http://msdn.microsoft.com/en-us/library/aa383608(v=vs.85)
【讨论】:
仅限 Windows 2012 / 8.1 及更高版本 https://technet.microsoft.com/en-us/library/jj649816%28v=wps.630%29.aspx
【讨论】:
Goyuix 回答在本地化窗口上失败:TaskName 是“Nombre de tarea”。为 win7 或更高版本构建了我自己的脚本(powershell 3 没有更新的 TaskSchd 函数)。第一部分做了一个提取本地化名称的虚拟任务。然后提取所有启用的任务。使 $toDisableArr 匹配要删除的黑名单。最后删除与我们想要保留的白名单任务不匹配的任务。删除最后一个评论符号 # 以实际完成这项工作。
# International aware disable SchdTasks:
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force #needs admin rights
# This is the RegEx match blacklist of tasks to disable any update/upload/telemetry/report, etc
$blackList="update|upload|telemetry|report|experience|schedule|sync|^\\{|\\AC"+
"|\\ASUS|^\\ATK|^\\AVGPCTun|^\\Acer|\\Ad|\\App|Overseer|^\\BacK|\\Blue|^\\ByteF"+
"|^\\CCl|^\\CL|^\\Creat|^\\Dash|^\\Easy|^\\Egis|^\\EPSON|^\\FubT|\\HP|\\Intel"+
"|\\Lenovo|\\Off|^\\Priv|\\.NET|\\Auto\|\\Broker|\\Clip|\\Cu|\\Dev|\\Diagn|\\Disk"+
"|\\DUSM|\\EDP|\\Enterpr|\\Error|\\Feedb|\\File|\\Flight|\\Hello|\\Input|\\Inst"+
"|\\Inter|\\Lang|\\License|\\Locat|\\Ma|\\Mobil|\\MUI|\\Net|\\Nla|\\Perf|\\PI"+
"|\\Pow|\\Push|\\RA|\\Re|\\Se|\\Sh|\\Side|\\Softw|\\Sp|\\St|\\Subs|\\Sysmain"+
"|\\TP|\\UN|\\UPnP|\\USB|\\User|\\WC|\\WD|\\Windows Activ|\\Windows Defender Ver"+
"|\\Windows Filt|\\WindowsBack|\\WindowsCol|\\Winin|\\Wlan|\\WOF|\\Work|\\Wwan"+
"|\\Xbl|^\\Mini|^\\Mir|^\\Mo|^\\Ne|^\\Norton WSC|^\\np|^\\Nv|^\\OIns|^\\Opt"+
"|^\\PD|^\\Qu|^\\Rt|^\\Sams|^\\SCC|^\\Smart|\\Sony|^\\Swe|^\\Sym|^\\Tun"+
"|^\\Ubt|^\\UMon|^\\wat|^\\Ya"
# This is the RegEx match whitelist of tasks that won't be disabled
$whiteList="\\AppListB|\\CertificateServ|\\Chkdsk|\\Data Int|\\DirectX"+
"|\\MemoryDiag|\\SystemSound|\\PI\\Secure|\\Plug |\\Printing|\\Registry"+
"|\\SystemRestore|\\Task Manager|\\IpAddressC|\\MsCtfMonitor|\\Time |\\sihpost"
# can't use "$?" no good if 2>null, use $LastExitCode instead
SCHTASKS /query /tn isidummy >null 2>&1
# if exist delete it
if ($lastexitcode -eq 0) { SCHTASKS /delete /tn isidummy /f >null 2>&1}
# create dummy enabled task to extract localized names
SCHTASKS /create /sc monthly /tn isidummy /tr clip.exe >null 2>&1
# $tarea[0] localized headers: [1] "TaskName"; [11] "Scheduled Task State"
$tarea=SCHTASKS /query /tn isidummy /v /fo csv
#[0] has headers names array
$campos = ($tarea[0] -split ',')
# Local names of "TaskName"; "Scheduled Task State" (may use .Trim('"') to remove "
$localTN=$campos[1]; $localSchedState=$campos[11]
#tarea[1] has isidummy values
$campos = ($tarea[1] -split ',')
# local name of "Enabled"
$localEnabled=$campos[11]
# remove auxiliary dummy task
SCHTASKS /delete /f /tn "isidummy" >null 2>&1
# Write localized names (ie SPA): "Nombre de tarea""Estado de tarea programada""Habilitado"
"Localized Names: " + $localTN + $localSchedState + $localEnabled
# this will find all enabled tasks, $localXXX will be replaced with localized names here:
$docommand= "`$tareas=SCHTASKS /Query /V /FO CSV | ConvertFrom-Csv | where-object {`$_.$localSchedState -eq $localEnabled }"
# SPA will execute: $tareas=SCHTASKS /Query /V /FO CSV | ConvertFrom-Csv | where-object { $_."Estado de tarea programada" -eq "Habilitado"}
Invoke-Expression $docommand
# extract all tasknames as a single string
$nombres=$tareas | Select-Object -Property $localTN.trim('"') | out-string
# "convert to array of strings separating in NewLines, first 3 lines are headers
$nombres= $nombres -split "\n", 0, "multiline"
# remove header strings (first 3 items), and duplicates
$nombres= $nombres[3..$nombres.count] | sort -unique
# fill toDisableArr array from allTasks ($nombres) matching blacklist
$toDisableArr= @();
foreach ($tarea in $nombres) {
if ($tarea -match $blackList) { $toDisableArr+= $tarea.TrimEnd() }
}
# parse toDisableArr, excluding whitelisted items
foreach ($tarea in $toDisableArr) {
if ($tarea -notmatch $whiteList) {
echo $tarea
# SCHTASKS /change /disable /tn $tarea
}
}
【讨论】:
"$env:windir\System32\SCHTASKS.EXE" /CommandLine '/change /disable /tn "$tarea"' /运行方式 8 /运行”;启动进程 ""$env:SystemDrive\UT\AdvancedRun.exe"" $doArguments