Powershell server 2012任务管理器 - 列表文件不起作用。手动运行脚本工作

时间:2017-10-30 09:28:50

标签: powershell server scheduled-tasks

我有以下脚本(这只是整个脚本的一部分):

$FileAge = (Get-Date).AddDays(-90)
$Paths = @("c:\Logs", "c:\inetpub\logs", "c:\Program Files (x86)\Spiceworks\Agent\log", "c:\Deployments")
$ExcludedExtensions = @("SvcTraceViewer.exe", "*DeployLog.xml")
$ExcludedFolders = @()
$Filter = "*.*"
#checking the paths if they exists
$CheckedPaths = {$Paths}.Invoke()

foreach ($Path in $Paths)
{
    if((Test-Path $Path) -eq $false)
    {
        $CheckedPaths.Remove($Path.ToString())
        if ($FailedPaths -eq $Null)
        {
            $FailedPaths = $Path
        }
        else
        {
            $FailedPaths = $FailedPaths + "`n$Path"
        } 
    }
}
if ($ExcludedFolders.GetLength(0) -eq 0)
{
    $List = Get-ChildItem -Path $CheckedPaths -Recurse -Filter $Filter -Exclude $ExcludedExtensions | Where-Object { !$_.PSIsContainer -and $_.LastWriteTime -lt $FileAge}
}
else
{
    $List = Get-ChildItem -Path $CheckedPaths -Recurse -Filter $Filter -Exclude $ExcludedExtensions | Where-Object { !$_.PSIsContainer -and $_.LastWriteTime -lt $FileAge -and $_.FullName -notmatch $ExcludedFolders}
}
$list | Out-File -filepath "c:\Jobs\LogCleanup\result.txt"

我已将脚本设置为在特定时间通过Server 2012 R2任务计划程序运行:

常规

  • Runas:“域名\域用户”
  • 运行用户是否登录:x(用户在“以批处理作业登录”)
  • 以最高权限运行:x

动作

  • 启动程序:powershell.exe -nologo -file "c:\jobs\logcleanup\logcleanup.ps1"

“域名\域用户”可以完全访问写入“result.txt”的文件夹。 同一用户对其搜索的所有文件夹具有修改权限

当调度程序运行脚本时,“result.txt”文件为空。 当我打开一个PowerShell窗口作为“域名\域用户”(shift +右键单击powershell - >以不同的用户身份运行)或者如果我运行Runas /user:...命令,则result.txt文件将填充数据。

当打开PowerShell提示符作为“域名\域用户”时,我检查“whoami”以确保我使用与任务计划程序相同的用户手动运行脚本。

打开命令提示符(命令刚刚运行成功),在任务计划程序中运行任务,会生成一个填充的“result.txt”文件。

同样的脚本也在几个Server 2008 R2服务器上运行而没有问题。只有在我的两台Server 2012 R2服务器上才能解决上述问题。

提前感谢任何输入: - )

1 个答案:

答案 0 :(得分:0)

经过大量测试,我终于找到了解决方案。我不知道为什么我的第一次尝试在任务计划程序中执行时不起作用。但是,以下代码在手动运行和在任务计划程序中运行时都有效:

$FileAge = -90
$Paths = @("c:\Logs", "c:\inetpub\logs", "c:\Program Files (x86)\Spiceworks\Agent\log", "c:\Deployments")
$ExcludedExtensions = @("SvcTraceViewer.exe", "*DeployLog.xml")
$ExcludedFolders = @()
$Filter = "*.*"
#checking the paths if they exists
$CheckedPaths = {$Paths}.Invoke()

foreach ($Path in $Paths)
{
    if((Test-Path $Path) -eq $false)
    {
        $CheckedPaths.Remove($Path.ToString())
        if ($FailedPaths -eq $Null)
        {
            $FailedPaths = $Path
        }
        else
        {
            $FailedPaths = $FailedPaths + "`n$Path"
        } 
    }
}
if ($ExcludedFolders.GetLength(0) -eq 0)
{
    $List = Get-ChildItem -Path $CheckedPaths -Recurse -Filter $Filter -Exclude $ExcludedExtensions | Where-Object { !$_.PSIsContainer -and $_.LastWriteTime -lt (Get-Date).AddDays($FileAge)}
}
else
{
    $List = Get-ChildItem -Path $CheckedPaths -Recurse -Filter $Filter -Exclude $ExcludedExtensions | Where-Object { !$_.PSIsContainer -and $_.LastWriteTime -lt (Get-Date).AddDays($FileAge) -and $_.FullName -notmatch $ExcludedFolders}
}
$list | Out-File -filepath "c:\Jobs\LogCleanup\result.txt"

我改变了什么:

在变量设置中

$FileAge = (Get-Date).AddDays(-90) => $FileAge = -90

在创建文件列表的“Where-object”排序部分

$_.LastWriteTime -lt $FileAge => $_.LastWriteTime -lt (Get-Date).AddDays($FileAge)