PowerShell: จัดเก็บเนื้อหาไฟล์ข้อความทั้งหมดในตัวแปร


118

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

คำตอบ:


122

ในการรับเนื้อหาทั้งหมดของไฟล์:

$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

1
ขอบคุณ! ดูเหมือนว่าจะทำในสิ่งเดียวกับ$content = [IO.File]::ReadAllText(".\test.txt") $content = (gc ".\test.txt" | out-string)เนื่องจากวินาทีที่สองสั้นกว่าฉันจึงชอบมากกว่า น่าเสียดายที่ทั้งสองวิธีที่คุณระบุไว้สำหรับการคำนวณจำนวนบรรทัดทั้งหมดจะไม่นำบรรทัดว่างต่อท้ายมาพิจารณา ความคิดอื่น ๆ ?
นิค

@Nick In .Net (และ windows) ทุกบรรทัด\r\nจะถูกนับ
manojlds

ฉันกำลังทำการทดลองบางอย่างและคิดแบบเดียวกันกับคำตอบที่อัปเดตของคุณ แต่ฉันจะไม่ได้รับความช่วยเหลือจากคุณดังนั้นขอบคุณมาก!
นิค

มีวิธีรวมสิ่งนี้เข้าด้วยกันอย่างโปร่งใสInvoke-WebRequestหรือไม่?
Kareem

189

หมายเหตุด้านข้างใน PowerShell 3.0 คุณสามารถใช้Get-Contentcmdlet กับสวิตช์ Raw ใหม่:

$text = Get-Content .\file.txt -Raw 

3
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ อย่างไรก็ตามฉันค่อนข้างมั่นใจว่า Get-Content ทำงานได้แม้ในเวอร์ชันก่อนหน้า
MatteoSp

10
@MatteoSp Get-Contentได้ แต่มันไม่ได้จนกว่า 3.0 -Rawว่ามันมี หากไม่มีสิ่งนั้นจะถูกจัดเก็บเป็นอาร์เรย์ของบรรทัด
jpmc26

นี่ควรเป็นคำตอบที่ยอมรับได้อย่างแน่นอน ไม่ได้ช่วยอะไรที่เอกสารบอกว่า-Rawพารามิเตอร์ไม่ได้ใช้งานโดยสิ่งใด ๆ
Richard Szalay

ขอบคุณนี่เป็นความช่วยเหลือที่ดีในตอนนี้
DAhrens

24

Powershell 2.0:

(ดูคำอธิบายโดยละเอียดที่นี่)

$text = Get-Content $filePath | Out-String

IO.File.ReadAllTextไม่ทำงานสำหรับฉันกับทางญาติจะมองหาไฟล์ใน%USERPROFILE%\$filePathแทนไดเรกทอรีปัจจุบัน (เมื่อวิ่งออกมาจาก Powershell ISE อย่างน้อย):

$text = [IO.File]::ReadAllText($filePath)

Powershell 3+:

$text = Get-Content $filePath -Raw

หากต้องการใช้เส้นทางญาติให้แก้ไขก่อนเช่น[IO.File]::ReadAllText((Resolve-Path $filePath))
mvanle

13

อีกวิธีหนึ่งในการอ่านไฟล์ที่ฉันชอบถูกอ้างถึงต่าง ๆ ว่าสัญกรณ์ตัวแปรหรือไวยากรณ์ของตัวแปรและเกี่ยวข้องกับการใส่ 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 บนไดรฟ์นั้นอาจเป็นแบบสัมบูรณ์หรือสัมพันธ์กัน


ฉันไม่เคยทำให้มันใช้งานได้เว้นแต่ฉันจะใส่แบ็กสแลชหลังชื่อไดรฟ์
Charles Anderson

@CharlesAnderson: ยังไม่ชัดเจนว่าคุณอ้างถึงสามตัวอย่างใดหรืออาจจะทั้งหมด ... อย่างไรก็ตามฉันเพิ่งยืนยันว่าทั้ง 3 ทำงานกับพา ธ สัมพัทธ์ (เช่นไม่มีแบ็กสแลช) ใน PowerShell V3 นอกจากนี้ในขณะที่ฉันตอบฉันใช้ V2 ดังนั้นอาจมีบางอย่างที่ทำให้เกิดปัญหาในสภาพแวดล้อมของคุณ
Michael Sorens

ฉันหมายถึงตัวอย่างเช่น $ {C: file.txt} ซึ่งฉันต้องเขียนเป็น $ {C: \ file.txt} ใช่ฉันคิดว่ามันเป็นเรื่องเกี่ยวกับสภาพแวดล้อมของฉัน แต่ฉันไม่รู้ว่าอะไร
Charles Anderson

เมื่อใช้เป็น L-value จะใช้การเข้ารหัสเริ่มต้นของระบบ ฉันพยายามตั้งค่า $ OutputEncoding โดยไม่มีผล เมื่อใช้เป็น R-value จะสร้างอาร์เรย์สตริง []
robert4

ดูเหมือนว่าคุณสามารถใช้ชื่อพา ธ ตามตัวอักษรเท่านั้น คุณไม่สามารถใช้ตัวแปรหรือนิพจน์ Join-Path ภายในนี้ได้ ซึ่งน่ารำคาญเพราะเมื่อวางท่อผ่าน ConvertTo-Json มีโลกที่แตกต่างเมื่อเทียบกับ Get-Content (และผลลัพธ์ $ {... } คือสิ่งที่ฉันหวังไว้ฉันไม่แน่ใจว่ามันจะเหมือนกันไหม เป็น Get-Content | Out-String แม้ว่า
Cameron Kerr

2

Get-Content จะดึงข้อมูลและทิ้งลงในอาร์เรย์ทีละบรรทัด สมมติว่าไม่มีข้อกำหนดพิเศษอื่น ๆ นอกเหนือจากที่คุณระบุไว้คุณสามารถบันทึกเนื้อหาของคุณลงในตัวแปรได้หรือไม่?

$file = Get-Content c:\file\whatever.txt

การเรียกใช้ก็$fileจะส่งคืนเนื้อหาทั้งหมด จากนั้นคุณก็สามารถทำได้$file.Count (เนื่องจากอาร์เรย์มีวิธีการนับอยู่แล้วในตัว) เพื่อรับจำนวนบรรทัดทั้งหมด

หวังว่านี่จะช่วยได้! ฉันไม่ใช่นักเขียนสคริปต์ แต่ดูเหมือนจะง่ายกว่าสำหรับฉันหลายอย่างข้างต้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.