【发布时间】:2015-09-25 16:27:54
【问题描述】:
我有一个删除旧临时文件的脚本,它在以下情况下完美运行:
- 从控制台主机
- 来自 PowerShell ISE
- 来自运行命令。换句话说,开始>>运行。输入
powershell.exe -file C:\Users\<userprofile>\Delete-TempFiles.ps1
但我想将其设置为计划任务,因为它可能需要一些时间才能完成。我的理解是,如果命令在 Run 行有效,那么我只需将该命令复制到 Task Scheduler 中的适当字段中。即,“操作”选项卡下的“程序/脚本”文本框。调度程序将“powershell.exe”之后的措辞移动到“参数”字段,一切都应该很好。 So saith Ed Wilson, Scripting Guy.
但是有些东西坏了。定期启动时,脚本会从文本文件中获取服务器名称,检查每个服务器上的临时文件夹,并删除旧文件,如下所示:
Get-ChildItem -Path \\$server\C$\Windows\Temp -File | Where-Object {$_.LastAccessTime -lt $cutoffdate} | Remove-Item -Recurse
在我测试过的每台服务器上,至少发现并删除了一些东西,正如预期的那样。但是当我设置计划任务时,发现/删除了零个文件。
经过一些故障排除后,我发现当我单击开始>>运行>>PowerShell 时,它会打开我的用户配置文件,但是当计划任务启动 PowerShell 时,它会打开C:\Windows\System32\WindowsPowerShell\v1.0\Powershell.exe。因为我的脚本是假设我的源文件在我的个人资料中,所以 PS 找不到它。我以为在计划任务中填写“开始于”文本框意味着 PowerShell 会在该文件夹中打开,但我想不会。
为了解决这个问题,我在脚本 (ick) 中硬编码了源文件的位置,并将Set-Location C:\Users\<userprofile> 放在脚本的顶部。但这不会改变任何事情。
我还尝试了以下操作:
powershell -noprofile -noexit -executionpolicy bypass -file C:\Users\<userprofile>\Delete-TempFolders.ps1
同样,脚本在作为任务启动时正常工作,但它无法找到或删除任何旧的临时文件。我就是不知道哪里出了问题。
【问题讨论】:
-
计划任务是以什么用户身份运行的?
-
@briantist - 大约 90% 的计划任务问题就在那里。
-
@EBGreen 是的,尤其是在涉及 UNC 路径时。
-
以我自己的用户ID运行,设置为无论用户是否登录都运行,不存储密码(由于安全限制不能),最高权限。该脚本从我使用“Get-Credential |”创建的 xml 文件中获取我的域密码。 Export-Clixml -path .\creds.xml'
-
密码未存储=您只能访问本地资源。 “本地”在这里有点误导,因为 HTTP 可能会工作,但没有 UNC 路径或任何需要 NTLM 身份验证的东西。
标签: windows powershell scheduled-tasks