Powershell脚本作为计划任务

时间:2015-09-25 16:27:54

标签: windows powershell scheduled-tasks

我有一个删除旧临时文件的脚本,它在以下情况下运行良好:

  1. 来自控制台主机
  2. 来自PowerShell ISE
  3. 从“运行”命令。换句话说,开始&gt;&gt;运行。输入powershell.exe -file C:\Users\<userprofile>\Delete-TempFiles.ps1
  4. 但是我想将它设置为计划任务,因为它可能需要一些时间才能完成。我的理解是,如果命令在Run行上运行,那么我只需要将该命令复制到Task Scheduler中的正确字段中。即,“操作”选项卡下的“程序/脚本”文本框。调度程序将'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
    

    在我测试的每台服务器上,至少找到并删除了一些内容,如预期的那样。但是当我设置计划任务时,会找到/删除零文件。

    经过一些故障排除后,我发现当我点击开始&gt;&gt;运行&gt;&gt; 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
    

    同样,作为任务启动时的脚本正常工作,除了它无法找到或删除任何旧的临时文件。我根本无法弄清楚它在哪里失败。

2 个答案:

答案 0 :(得分:1)

要将我以前的评论正式化为答案,这里摘录自TechNet article on the subject

  

如果您选中标有不存储密码的复选框,请执行以下操作   调度程序不会存储本地提供的凭据   计算机,但在正确验证后将丢弃它们   用户。当需要运行任务时,任务计划程序服务将   使用Kerberos的“Service-for-User”(S4U)扩展   用于检索用户令牌的身份验证协议。

     

使用S4U时服务使用安全上下文的能力   该帐户受到限制。特别是,该服务只能使用   访问本地资源的安全上下文。如果您的任务需要   访问网络资源,不能使用S4U;这样做会导致   你的任务失败了。唯一的例外是受限制的情况   代表团是在参与的计算机之间建立的   操作。如果您使用的是S4U功能,则任务不会   可以访问加密文件。

换句话说,您有三个选择:

1)存储任务本地需要的所有内容(或将任务本身移动到文件所在的计算机上)。

2)使用不需要域身份验证的网络协议。这可能是不安全的,您可能无法使用方便的库存cmdlet,例如Get-ChildItem

3)设置Kerberos constrained delegation。这说起来容易做起来难,但仍有可能。

答案 1 :(得分:0)

这并不直接尝试回答您的问题。相反,通过将输出重定向到日志文件,提供了一种更好地进行故障排除的方法。使用powershell作为命令并以-NonInteractive -windowstyle minimized -c "powershell -c "C:\Users\<userprofile>\Delete-TempFolders.ps1" -verbose >> "C:\LogPath\ConsoleLogs\TempFoldersPS1.log" 2>&1"作为参数运行脚本。

希望这会有所帮助。另外,让我知道我会把它拿下来。