PowerShell, ทำความสะอาดไฟล์เก่ากว่า x วัน - ป้องกันจุดเชื่อมต่อ NTFS


-1

ฉันมีสคริปต์ที่ล้างข้อมูลไฟล์และโฟลเดอร์ที่เก่ากว่าแล้วจำนวนวัน x แต่ฉันต้องทำให้มันปลอดภัยยิ่งขึ้น สคริปต์เช่นเดียวกับถ้ามีคนสร้างลิงก์ไปเช่นไฟล์โปรแกรมทุกอย่างในตำแหน่งนั้นก็จะถูกลบเช่นกัน ฉันจะรักษาความปลอดภัยสคริปต์ของฉันจากจุดแยกได้อย่างไร

$path = "\\server\D$\Temp"
$items = get-childitem $path -Force -Recurse 

foreach($item in $items)
{
            $subitems = get-childitem -recurse -path $item.fullname
            foreach($subitem in $subitems)
            {
                if($subitem.lastwritetime -lt (date).adddays(-4))
                {
                    $filename = $subitem.fullname
                    if($filename -ne $null)
                    {
                        #Use below code to specify file type


                            "Remove item: " + $filename + " - " + $subitem.lastwritetime
                            remove-item $filename -recurse -WhatIf


                }
             }
        }
        $subitems_after = get-childitem -recurse -path $item.fullname
        if($subitems_after.Count -eq 0)
        {
            "Remove item: " + $item
            remove-item $item.FullName -WhatIf
        }

}

สวัสดี! เราไม่ใช่บริการเขียนสคริปต์ฟรี ไม่ต้องกังวลผู้ใช้ใหม่จำนวนมากดูเหมือนจะทำผิดพลาด หากต้องการรับความช่วยเหลือเกี่ยวกับสิ่งนี้โปรดแก้ไขคำถามของคุณเพื่อรวมการวิจัยที่คุณได้ทำสิ่งที่คุณได้ลองไปแล้ว (และผลลัพธ์ที่ได้)
Ƭᴇcʜιᴇ007

บางทีนี่อาจช่วยให้คุณเริ่มต้นได้: ทดสอบในรหัส PowerShell หากโฟลเดอร์เป็นจุดเชื่อมต่อ
Ƭᴇcʜιᴇ007

คำตอบ:


0

ลองใช้สคริปต์ต่อไปนี้ซึ่งอาจกรองโฟลเดอร์ Mount Point ออกและแสดงรายการโฟลเดอร์ทั่วไป (คุณสามารถเพิ่มตัวกรองเวลาในฟังก์ชันนั้นหรือทำในภายหลัง):

 function dir_NoMP ( $i ) {
        #check if it is a mount point folder
        $z = ( (get-item $i).Attributes -band [IO.FileAttributes]::ReparsePoint )

        #if it it not an empty folder call function itself
        if ( ($x =(Get-ChildItem $i -Directory ).fullname) -and (!$z ) ) { 

         #if it is a mount point , filter it out .
         $x | foreach {if ( !( (get-item $_).Attributes -band [IO.FileAttributes]::ReparsePoint ) ) {$_} } ;

         foreach ($y in $x) { dir_NoMP $y } }

    }  
    dir_nomp "d:\test"

หลังจากนั้นคุณสามารถทำสิ่งที่คุณต้องการสำหรับโฟลเดอร์เหล่านี้


มันทำงานได้ขอบคุณปัญหาคนเดียวที่เหลือ :( สถานที่มีมากขึ้นแล้ว 260 ตัวอักษรเพื่อให้มีการหาวิธีอื่น แต่ขอบคุณสำหรับ youre ช่วย paul
Wouter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.