Невозможно получить имя файла, используя Get-ChildItem с PowerShell - PullRequest
0 голосов
/ 14 января 2019

Я проверяю каждую папку на наличие каталога HTMLreports, а затем удаляю файлы старше 30 дней. Но когда он получает имя файла для $document.Name или $image.name в цикле foreach, он не получает имя файла для удаления файла для команды Remove-Item.

$items = Get-ChildItem -Path "C:\Program Files (x86)\Jenkins\jobs\"
$time = (Get-Date).AddDays(-30)
$today = Get-Date

echo $today

# enumerate the items array
foreach ($item in $items) {
   # if the item is a directory, then process it.
   if ($item.Attributes -eq "Directory") {
        Write-Host "job folder: " $item.Name

        $folder = Get-ChildItem -Path ("C:\Program Files (x86)\Jenkins\jobs\" + $item.Name + "\")

        if (Test-Path ("C:\Program Files (x86)\Jenkins\jobs\"+$item.Name+"\htmlreports\")) {
            $reports = Get-ChildItem -Path ("C:\Program Files (x86)\Jenkins\jobs\" + $item.Name + "\htmlreports\")

            foreach ($report in $reports) {
                Write-Host "report folder" $report.Name

                $documents = Get-ChildItem -Path ("C:\Program Files (x86)\Jenkins\jobs\" + $item.Name + "\htmlreports\" + $report.Name + "\") |
                             Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $time }

                foreach ($document in $documents) {
                    if ($document.Attributes -eq "Directory") {
                        echo "Folder exists"
                        Write-Host "delete document folder" $document.Name
                        Remove-Item ("C:\Program Files (x86)\Jenkins\jobs\" + $item.Name + "\htmlreports\"+$report.Name+"\" + $document.Name)
                    } else {
                        echo "File exists"
                        Write-Host "delete document " $document.Name
                        Remove-Item ("C:\Program Files (x86)\Jenkins\jobs\" + $item.Name + "\htmlreports\"+$report.Name+"\" + $document.Name)
                    }
                }

                if (Test-Path ("C:\Program Files (x86)\Jenkins\jobs\" + $item.Name + "\htmlreports\" + $report.Name + "\images\")) {
                    echo "Image Folder exists"

                    $images = Get-ChildItem -Path ("C:\Program Files  (x86)\Jenkins\jobs\" + $item.Name + "\htmlreports\" + $report.Name + "\images\") -Name |
                              Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $time }

                    foreach ($image in $images) {
                        Write-Host "delete image: C:\Program  Files (x86)\Jenkins\jobs\"$item.Name"\htmlreports\"$report.Name"\images\"$image.Name
                        Remove-Item ("C:\Program Files (x86)\Jenkins\jobs\" + $item.Name + "\htmlreports\" + $report.Name + "\images \" + $image.Name);
                    }
                }
            }
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Предыдущий ответ удален после повторного просмотра.

Похоже, вы просто хотите удалить все файлы после определенной даты в папке jobs \ htmlreport, а в подпапке с изображениями вы можете уменьшить свой код до этой ...

Clear-Host

$ReportFiles = (Get-ChildItem -Path "${env:ProgramFiles(x86)}\Jenkins\jobs\htmlreports" -Recurse).FullName

($today = Get-Date)
($time = (Get-Date).AddDays(-30))

ForEach($File in (Get-ChildItem -Path $ReportFiles -File))
{
    If ($File.FullName.CreationTime -lt $time)
    {"Processing $($File.FullName)"}
}

… конечно, если есть другие папки, вы должны просто отфильтровать эти две.

0 голосов
/ 15 января 2019

Спасибо всем за ваши идеи, я смог заставить это работать с моим кодом ниже. Я проверяю все папки или отчеты в каталоге заданий, и для каждого отчета я захожу в каталог htmlreports и удаляю все файлы и изображения в каталоге изображений, возраст которых превышает 30 дней. Если есть более чистый способ сделать это, пожалуйста, дайте мне знать, я использую powershell v1.0.

$items = gci "C:\Program Files (x86)\Jenkins\jobs\"
($today = Get-Date)
($time = $today.AddDays(-30))

Write-Host $today

# enumerate the items array
foreach ($item in $items) {
   # if the item is a directory, then process it.
   if ($item.Attributes -eq "Directory") {
        Write-Host "job folder: " $item.Name
        if (Test-Path ("C:\Program Files (x86)\Jenkins\jobs\"+$item.Name+"\htmlreports\")) {
            $reports = Get-ChildItem -Path ("C:\Program Files (x86)\Jenkins\jobs\" + $item.Name + "\htmlreports\")

            foreach ($report in $reports) {
                Write-Host "report folder" $report.Name
                $documents = ("C:\Program Files (x86)\Jenkins\jobs\" + $item.Name + "\htmlreports\" + $report.Name + "\")
                dir -recurse $documents | where {$_.LastWriteTime -le $time} | del


                if (Test-Path ("C:\Program Files (x86)\Jenkins\jobs\" + $item.Name + "\htmlreports\" + $report.Name + "\images\")) {
                    Write-Host "Image Folder exists"
                    $images = ("C:\Program Files (x86)\Jenkins\jobs\" + $item.Name + "\htmlreports\" + $report.Name + "\images\")                      
                    dir -recurse $images | where {$_.LastWriteTime -le $time} | del
                }
            }

        }
    }
}
0 голосов
/ 14 января 2019

Вместо того, чтобы повторять длинный путь снова и снова, сохраните его в переменной.

Вы ошибочно вставили дополнительное пространство несколько раз между

C:\Program  Files (x86)\Jenkins\jobs\

, а также

"C:\Program Files  (x86)\Jenkins\jobs\"
...