重启后执行脚本并自动清理的PowerShell计划任务问题求助
问题分析与修正方案
你的代码存在多个语法和逻辑错误,导致计划任务无法执行、日志无内容,以下是具体问题和修复后的完整代码:
核心错误点
- $Environment变量赋值错误:反引号位置不当,且
Get-ItemProperty返回的是对象,直接拼接会得到对象的字符串表示而非目标属性值,需指定具体属性(比如注册表项中的AccountName,根据实际情况调整)。 - 未定义$FileName变量:多处使用
$FileName但未提前赋值,导致文件路径无效。 - New-Item参数错误:Path中多余括号,且未正确使用
$FileName变量。 - 计划任务触发器错误:误用
New-JobTrigger(用于PowerShell Job),计划任务应使用New-ScheduledTaskTrigger。 - Add-Content参数顺序颠倒:应先指定
-Path再指定-Value。 - 脚本生成逻辑缺失:重启后原会话变量丢失,需将日志文件路径硬编码到生成的
TaskScript.ps1中,而非依赖当前会话的变量。 - 无效函数调用:
DoFirst函数不存在,应直接调用日志写入逻辑。
修复后的完整代码
# 获取注册表中的环境属性(替换为实际需要的属性名,比如AccountName) $Environment = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\WOW6432Node\<software>\A180\12.2\Default\Account').AccountName $ScriptType = 'Test' $ScriptName = 'This might work' $FolderPath = 'C:\Log\scripts\test' # 定义完整日志文件名 $FileName = Join-Path -Path $FolderPath -ChildPath "$Environment_$ScriptType_$ScriptName.log" # 若日志文件不存在则创建 if (-not (Test-Path -Path $FileName)) { New-Item -ItemType File -Path $FileName -Force | Out-Null } # 创建计划任务的函数 function Schedule-Task { $scriptPath = 'C:\My Folders\TaskScript.ps1' $actionArgs = "-ExecutionPolicy Bypass -File `"$scriptPath`"" $Action = New-ScheduledTaskAction -Execute 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe' -Argument $actionArgs $Trigger = New-ScheduledTaskTrigger -AtStartup -RandomDelay (New-TimeSpan -Minutes 5) $Principal = New-ScheduledTaskPrincipal -UserId 'NT AUTHORITY\SYSTEM' -LogonType ServiceAccount -RunLevel Highest Register-ScheduledTask -TaskName 'Post_Reboot_Script' -Principal $Principal -Action $Action -Trigger $Trigger -Force } # 生成重启后执行的脚本 function Create-Script { $scriptContent = @" # 写入重启完成日志 `$DateMessage = "$((Get-Date -Format G)) Reboot complete" Add-Content -Path "$FileName" -Value `$DateMessage -Encoding Ascii # 清理脚本和计划任务 Remove-Item -Path 'C:\My Folders\TaskScript.ps1' -Force -ErrorAction SilentlyContinue Unregister-ScheduledTask -TaskName 'Post_Reboot_Script' -Confirm:`$false -ErrorAction SilentlyContinue "@ $scriptPath = 'C:\My Folders\TaskScript.ps1' # 确保脚本目录存在 if (-not (Test-Path -Path (Split-Path -Path $scriptPath))) { New-Item -ItemType Directory -Path (Split-Path -Path $scriptPath) -Force | Out-Null } Set-Content -Path $scriptPath -Value $scriptContent -Encoding Ascii } # 执行脚本生成和计划任务注册 Create-Script Schedule-Task
注意事项
- 替换
<software>为实际注册表路径中的软件名称,同时将AccountName替换为你需要从注册表读取的具体属性名。 - 脚本需以管理员权限运行,否则无法创建计划任务、写入C盘目录。
-ExecutionPolicy Bypass用于避免PowerShell执行策略限制,若你的环境执行策略允许,可移除该参数。
内容的提问来源于stack exchange,提问作者T3kdud3
相关产品推荐
相关产品推荐

