2016-07-19 4 views
-1

Может кто-нибудь сказать мне, что здесь происходит? Я могу получить -Filter * .log, чтобы работать без проблем.PowerShell Get-ChildItem -Exclude и -Include не работает

PS C:\logs> Get-ChildItem -Filter *.log -Recurse 


    Directory: C:\logs 


Mode    LastWriteTime  Length Name 
----    -------------  ------ ---- 
-a---   7/19/2016 2:45 PM   0 Moninitor-error-1.log 
-a---   7/19/2016 2:45 PM   0 Moninitor-out-1.log 
-a---   7/19/2016 2:45 PM   0 Watcher-error-3.log 
-a---   7/19/2016 2:52 PM  264810 Watcher-out-3.log 
-a---   7/19/2016 2:48 PM   0 FolderWatcher-error-2.log 
-a---   7/19/2016 2:52 PM 7768537 FolderWatcher-out-2.log 
-a---   7/19/2016 4:34 PM   0 nothing-error.log 
-a---   7/19/2016 4:34 PM   0 nothing.log 
-a---   7/18/2016 2:38 PM   0 log-error-0.log 
-a---   7/19/2016 2:45 PM   0 log-out-0.log 

как только я пытаюсь использовать -Include или -Exclude Я получаю ошибку доступа.

PS C:\logs> Get-ChildItem -Exclude *.log -Recurse 
Get-ChildItem : Access is denied 
At line:1 char:1 
+ Get-ChildItem -Exclude *.log -Recurse 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [Get-ChildItem], UnauthorizedAccessException 
    + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.GetChildItemCommand 

PS C:\logs> Get-ChildItem -Include *.log -Recurse 
Get-ChildItem : Access is denied 
At line:1 char:1 
+ Get-ChildItem -Include *.log -Recurse 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : PermissionDenied: (C:\...tor-error-1.log:String) [Get-ChildItem], UnauthorizedAccessException 
    + FullyQualifiedErrorId : GetItemUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand 

Get-ChildItem : Access is denied 
At line:1 char:1 
+ Get-ChildItem -Include *.log -Recurse 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [Get-ChildItem], UnauthorizedAccessException 
    + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.GetChildItemCommand 

То, что я хотел сделать, это перебрать файлы в этом каталоге и удалять любые, которые старше, чем 0 дней, и не содержат ошибки в имени файла.

Мой текущий сценарий - это.

#----- define parameters -----# 
#----- get current date ----# 
$Now = Get-Date 
#----- define amount of days ----# 
$Days = "0" 
#----- define folder where files are located ----# 
$TargetFolder = "C:\logs" 
#----- define extension ----# 
$Extension = "*.log" 
$Skip = "*error*" 
#----- define LastWriteTime parameter based on $Days ---# 
$LastWrite = $Now.AddDays(-$Days) 
#----- get files based on lastwrite filter and specified folder ---# 
$Files = Get-ChildItem -Path $TargetFolder -Filter $Extension -Exclude $Skip -Recurse | Where {$_.LastWriteTime -le "$LastWrite"} 
foreach ($File in $Files) 
    { 
    if ($File -ne $NULL) 
     { 
     write-host "Deleting File $File" -ForegroundColor "DarkRed" 
     Remove-Item $File.FullName | out-null 
     } 
    else 
     { 
     Write-Host "No more files to delete!" -foregroundcolor "Green" 
     } 
    } 

Но в любое время я подал в суд Исключить или включить Это дает мне эти ошибки доступа.

-Recurse на своих работах, а также прекрасно ...

PS C:\Users\Administrator\.pm2\logs> Get-ChildItem -Recurse 


    Directory: C:\logs 


Mode    LastWriteTime  Length Name 
----    -------------  ------ ---- 
-a---   7/19/2016 2:45 PM   0 Moninitor-error-1.log 
-a---   7/19/2016 2:45 PM   0 Moninitor-out-1.log 
-a---   7/19/2016 2:45 PM   0 Watcher-error-3.log 
-a---   7/19/2016 2:52 PM  264810 Watcher-out-3.log 
-a---   7/19/2016 2:48 PM   0 FolderWatcher-error-2.log 
-a---   7/19/2016 2:52 PM 7768537 FolderWatcher-out-2.log 
-a---   7/19/2016 4:34 PM   0 nothing-error.log 
-a---   7/19/2016 4:34 PM   0 nothing.log 
-a---   7/18/2016 2:38 PM   0 log-error-0.log 
-a---   7/19/2016 2:45 PM   0 log-out-0.log 
+0

Вы пробовали 'Get-ChildItem -Recurse' самостоятельно? Похоже, что '-Filter' применяется файловой системой, поэтому вы можете отфильтровывать файлы, к которым у вас нет доступа, прежде чем вы их попросите. – Guvante

+0

да. -Recurse отлично работает сама по себе. Будет редактировать выше – shaun

ответ

0

Try удачи с этим

$Extension = "*log" 
    $TargetFolder = "c:\logs" 
    Get-Childitem $TargetFolder -Include $Extension -Recurse 

$Extension = "*txt" 
    $TargetFolder = "c:\logs" 
    Get-Childitem $TargetFolder -exclude $Extension -Recurse 
0

Честно говоря, вы хотите использовать -Filter, потому что, как @Guvante отметил, это применяется поставщиком файловой системы и значительно ускорит процесс. После этого просто подключитесь к оператору Where, чтобы удалить вещи с ошибкой в ​​имени и не достаточно стары.

Get-ChildItem -Filter *.log -Recurse | Where{$_.name -notlike "*error*" -and $_.lastwritetime -lt [datetime]::Today} 

Или поменять lastwritetime для creationtime, если вы хотите, когда файл был создан вместо последнего изменения.

 Смежные вопросы

  • Нет связанных вопросов^_^