我有一个删除旧临时文件的脚本,它在以下场景下运行良好:
-
从控制台主机
-
来自PowerShell ISE
-
从“运行”命令 . 换句话说,开始>>运行 . 输入
powershell.exe -file C:\Users\<userprofile>\Delete-TempFiles.ps1
但我想将其设置为计划任务,因为它可能需要一些时间才能完成 . 我的理解是,如果命令在Run行上运行,那么我只需要将该命令复制到Task Scheduler中的正确字段中 . 即'Actions'选项卡下的'Program/script'文本框 . 调度程序将'powershell.exe'之后的措辞移动到'Arguments'字段,一切都应该是好的 . 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
. 因为我的脚本是为了假设我的源文件在我的 Profiles 中而写的,所以PS无法找到它 . 我认为填写计划任务中的"Start In"文本框意味着PowerShell会在该文件夹中打开,但我想不会 .
为了解决这个问题,我在我的脚本(ick)中硬编码了源文件的位置,并将 Set-Location C:\Users\<userprofile>
放在我的脚本顶部 . 但这并没有改变任何事情 .
我还尝试了以下操作:
powershell -noprofile -noexit -executionpolicy bypass -file C:\Users\<userprofile>\Delete-TempFolders.ps1
同样,作为任务启动时的脚本正常工作,除了它无法找到或删除任何旧的临时文件 . 我根本无法弄清楚它失败的地方 .
2 回答
要将我以前的评论正式化为答案,这里是TechNet article on the subject的摘录:
换句话说,您有三种选择:
1)存储任务本地需要的所有内容(或将任务本身移动到文件所在的计算机) .
2)使用不能使用方便的库存cmdlet的网络协议,例如
Get-ChildItem
.3)设置Kerberos constrained delegation . 说起来容易做起来难,但仍有可能 .
这并不直接试图回答你的问题 . 相反,通过将输出重定向到日志文件,提供了一种更好地进行故障排除的方法 . 使用
powershell
作为命令并使用-NonInteractive -windowstyle minimized -c "powershell -c "C:\Users\<userprofile>\Delete-TempFolders.ps1" -verbose >> "C:\LogPath\ConsoleLogs\TempFoldersPS1.log" 2>&1"
作为参数运行脚本 .希望这可以帮助 . 另外,让我知道我会把它拿下来 .