我有以下脚本(这只是整个脚本的一部分):
$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任务计划程序运行:
常规
动作
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服务器上才能解决上述问题。
提前感谢任何输入: - )
答案 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)