ในการทดสอบของฉัน เส้นทางทางกายภาพ
คุณสมบัติสามารถมีตัวแปรที่จัดรูปแบบ cmd.exe %ไดรฟ์ระบบ%
.
เมื่อสิ่งนี้เกิดขึ้น คุณสามารถใช้เส้นทางทางกายภาพและแยกชื่อตัวแปรสภาพแวดล้อมและเส้นทางที่เหลือโดยใช้ regex ดึงค่าของตัวแปรออกมาและสร้างเส้นทาง
$filepath = 'C:\sites.csv'
$sites = รับเว็บไซต์
foreach($site ใน $sites) {
if($site.physicalPath -match '^%(.+)%(.+)$'){
$sitedir = เส้นทางเข้าร่วม (รับเนื้อหา "env:$($matches.1)") $matches.2
Get-ChildItem -LiteralPath $sitedir
}
}
หากคุณยืนยันว่านี่แสดงรายการไฟล์สำหรับแต่ละไซต์ได้อย่างถูกต้อง ดูเหมือนว่าคุณได้ทราบส่วนการวัดแล้ว
คำแนะนำอื่น ๆ อีกสองสามข้อ ก่อนอื่นฉันขอแนะนำ ส่งออก Csv
แทน ไฟล์ออก
.
ต่อไป แทนที่จะเปิดไฟล์แล้วต่อท้ายซ้ำแล้วซ้ำเล่า (ช้า) คุณสามารถรวบรวมผลลัพธ์ทั้งหมดแล้วเขียนได้
$results = foreach($site ใน $sitelist){
...รหัส...
}
ผลลัพธ์ $ | ไฟล์นอกไฟล์ $filepath
หรือคุณสามารถใช้ สำหรับแต่ละวัตถุ
และใช้ประโยชน์จากท่อ
$sitelist | สำหรับแต่ละวัตถุ {
...รหัส...
} | ไฟล์นอกไฟล์ $filepath
ประโยชน์ด้าน สำหรับแต่ละวัตถุ
คือ -OutVariable
พารามิเตอร์ที่ให้คุณจับเอาต์พุตในตัวแปร (ซึ่งเป็นประเภท รายการอาร์เรย์
) และดูผลลัพธ์ (หรือไพพ์ไปยังคำสั่งเพิ่มเติม)
เมื่อพิจารณาจากคำแนะนำของฉัน ฉันจะลองดู
$filepath = 'C:\sites.csv'
$sites = รับเว็บไซต์
$ไซต์ | สำหรับแต่ละวัตถุ {
$ip, $port, $hostHeader = $_.bindings.collection.bindinginformation.split(":")
$path = if($_.physicalPath -match '^%(.+)%(.+)$'){
เส้นทางเข้าร่วม (รับเนื้อหา "env:$($matches.1)") $matches.2
}
อื่น{
$_.เส้นทางกายภาพ
}
$size = (เส้นทาง Get-ChildItem -Recurse | วัดวัตถุ -ความยาวคุณสมบัติ -ผลรวม -ErrorAction Stop)ผลรวม / 1MB
[PSCustomObject]@{
ชื่อ = $_.name
เส้นทางเต็ม = เส้นทาง $
ไอพี = $ไอพี
พอร์ต = $พอร์ต
HostHeader = $โฮสต์เฮดเดอร์
SizeMB = ขนาด $
}
} -OutVariable ผลลัพธ์
ผลลัพธ์ $ | ส่งออก Csv $filepath -NoTypeInformation