2015-09-25 164 views
1

我已经得到了删除旧的临时文件的脚本,并在以下情况下完美的作品:PowerShell脚本作为计划任务

  1. 从控制台主机
  2. 从PowerShell的ISE
  3. 从运行命令。换句话说,开始>>运行。输入powershell.exe -file C:\Users\<userprofile>\Delete-TempFiles.ps1

但我想将它设置为预定任务,因为它可能需要一些时间才能完成。我的理解是,如果一个命令在运行行工作,那么我只需将该命令复制到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 

在每一个我测试服务器,至少东西被发现,按预期删除。但是,当我设置计划任务时,会找到/删除零个文件。

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

同样,当启动一个任务正常工作,除了它无法找到或删除任何旧的临时文件的脚本。我根本找不到它失败的地方。

+3

运行的计划任务是什么用户? – briantist

+0

@ briantist - 约90%的计划任务问题就在那里。 – EBGreen

+0

@EBGreen是的,特别是当涉及UNC路径时。 – briantist

回答

0

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

希望这会有所帮助。否则,让我知道我会采取这一点。

1

为了形式化我以前的评论作为一个答案,这里是从TechNet article on the subject的摘录:

如果选择标记不要储存密码的复选框,任务 计划不会存储在提供的凭据本地 计算机,但在正确验证 用户后将丢弃它们。当需要运行该任务时,任务计划程序服务 将使用Kerberos 身份验证协议的“服务 - 用户”(S4U)扩展来检索用户的令牌。

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

换句话说,你有三种选择:

1)店铺一切的任务,需要在本地(或移动任务本身到文件所在的计算机)。

2)使用不需要域认证的网络协议。这可能不安全,您可能无法使用便利的库存命令,如Get-ChildItem

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