ฉันต้องการใช้ PowerShell เพื่อจัดเก็บเนื้อหาทั้งหมดของไฟล์ข้อความ (รวมถึงบรรทัดว่างต่อท้ายที่อาจมีหรือไม่มีอยู่) ในตัวแปร ฉันต้องการทราบจำนวนบรรทัดทั้งหมดในไฟล์ข้อความ วิธีใดมีประสิทธิภาพที่สุดในการทำเช่นนี้
ฉันต้องการใช้ PowerShell เพื่อจัดเก็บเนื้อหาทั้งหมดของไฟล์ข้อความ (รวมถึงบรรทัดว่างต่อท้ายที่อาจมีหรือไม่มีอยู่) ในตัวแปร ฉันต้องการทราบจำนวนบรรทัดทั้งหมดในไฟล์ข้อความ วิธีใดมีประสิทธิภาพที่สุดในการทำเช่นนี้
คำตอบ:
ในการรับเนื้อหาทั้งหมดของไฟล์:
$content = [IO.File]::ReadAllText(".\test.txt")
จำนวนบรรทัด:
([IO.File]::ReadAllLines(".\test.txt")).length
หรือ
(gc .\test.ps1).length
ประเภทของการแฮ็กเพื่อรวมบรรทัดว่างต่อท้าย:
[io.file]::ReadAllText(".\desktop\git-python\test.ps1").split("`n").count
\r\n
จะถูกนับ
Invoke-WebRequest
หรือไม่?
หมายเหตุด้านข้างใน PowerShell 3.0 คุณสามารถใช้Get-Content
cmdlet กับสวิตช์ Raw ใหม่:
$text = Get-Content .\file.txt -Raw
Get-Content
ได้ แต่มันไม่ได้จนกว่า 3.0 -Raw
ว่ามันมี หากไม่มีสิ่งนั้นจะถูกจัดเก็บเป็นอาร์เรย์ของบรรทัด
-Raw
พารามิเตอร์ไม่ได้ใช้งานโดยสิ่งใด ๆ
$text = Get-Content $filePath | Out-String
IO.File.ReadAllText
ไม่ทำงานสำหรับฉันกับทางญาติจะมองหาไฟล์ใน%USERPROFILE%\$filePath
แทนไดเรกทอรีปัจจุบัน (เมื่อวิ่งออกมาจาก Powershell ISE อย่างน้อย):
$text = [IO.File]::ReadAllText($filePath)
$text = Get-Content $filePath -Raw
[IO.File]::ReadAllText((Resolve-Path $filePath))
อีกวิธีหนึ่งในการอ่านไฟล์ที่ฉันชอบถูกอ้างถึงต่าง ๆ ว่าสัญกรณ์ตัวแปรหรือไวยากรณ์ของตัวแปรและเกี่ยวข้องกับการใส่ filespec ไว้ในวงเล็บปีกกาที่นำหน้าด้วยเครื่องหมายดอลลาร์เพื่อปัญญา:
$content = ${C:file.txt}
สัญกรณ์นี้อาจจะถูกใช้เป็นทั้งL-คุ้มค่าหรือ R-value ; ดังนั้นคุณสามารถเขียนลงไฟล์ได้อย่างง่ายดายด้วยสิ่งนี้:
${D:\path\to\file.txt} = $content
การใช้งานที่สะดวกอีกอย่างหนึ่งคือคุณสามารถแก้ไขไฟล์ในตำแหน่งโดยไม่มีไฟล์ชั่วคราวและไม่มีนิพจน์ย่อยตัวอย่างเช่น:
${C:file.txt} = ${C:file.txt} | select -skip 1
ตอนแรกฉันรู้สึกทึ่งกับสัญกรณ์นี้เพราะมันยากมากที่จะหาอะไรเกี่ยวกับมัน! แม้แต่ข้อกำหนดของ PowerShell 2.0 ก็ยังระบุเพียงครั้งเดียวที่แสดงเพียงบรรทัดเดียวโดยใช้ แต่ไม่มีคำอธิบายหรือรายละเอียดการใช้งานเลย ฉันพบรายการบล็อกนี้ในตัวแปร PowerShellในภายหลังที่ให้ข้อมูลเชิงลึกที่ดี
หมายเหตุสุดท้ายเกี่ยวกับการใช้สิ่งนี้: คุณต้องใช้การกำหนดไดรฟ์เช่น${drive:filespec}
ที่ฉันได้ทำในตัวอย่างทั้งหมดข้างต้น หากไม่มีไดรฟ์ (เช่น${file.txt}
) จะไม่ทำงาน ไม่มีข้อ จำกัด เกี่ยวกับ filespec บนไดรฟ์นั้นอาจเป็นแบบสัมบูรณ์หรือสัมพันธ์กัน
Get-Content จะดึงข้อมูลและทิ้งลงในอาร์เรย์ทีละบรรทัด สมมติว่าไม่มีข้อกำหนดพิเศษอื่น ๆ นอกเหนือจากที่คุณระบุไว้คุณสามารถบันทึกเนื้อหาของคุณลงในตัวแปรได้หรือไม่?
$file = Get-Content c:\file\whatever.txt
การเรียกใช้ก็$file
จะส่งคืนเนื้อหาทั้งหมด จากนั้นคุณก็สามารถทำได้$file.Count
(เนื่องจากอาร์เรย์มีวิธีการนับอยู่แล้วในตัว) เพื่อรับจำนวนบรรทัดทั้งหมด
หวังว่านี่จะช่วยได้! ฉันไม่ใช่นักเขียนสคริปต์ แต่ดูเหมือนจะง่ายกว่าสำหรับฉันหลายอย่างข้างต้น
$content = [IO.File]::ReadAllText(".\test.txt")
$content = (gc ".\test.txt" | out-string)
เนื่องจากวินาทีที่สองสั้นกว่าฉันจึงชอบมากกว่า น่าเสียดายที่ทั้งสองวิธีที่คุณระบุไว้สำหรับการคำนวณจำนวนบรรทัดทั้งหมดจะไม่นำบรรทัดว่างต่อท้ายมาพิจารณา ความคิดอื่น ๆ ?