Câu trả lời:
Để lấy toàn bộ nội dung của tệp:
$content = [IO.File]::ReadAllText(".\test.txt")
Số dòng:
([IO.File]::ReadAllLines(".\test.txt")).length
hoặc là
(gc .\test.ps1).length
Phân loại hackish để bao gồm dòng trống ở cuối:
[io.file]::ReadAllText(".\desktop\git-python\test.ps1").split("`n").count
\r\n
sẽ được tính.
Invoke-WebRequest
?
Một lưu ý nhỏ, trong PowerShell 3.0, bạn có thể sử dụng Get-Content
lệnh ghép ngắn với công tắc Raw mới:
$text = Get-Content .\file.txt -Raw
Get-Content
đã có, nhưng phải đến 3.0 mới có -Raw
. Nếu không có điều đó, nó sẽ được lưu trữ dưới dạng một mảng các dòng.
-Raw
tham số không được thực hiện bởi bất kỳ thứ gì gốc.
(xem giải thích chi tiết tại đây)
$text = Get-Content $filePath | Out-String
Nó IO.File.ReadAllText
không hoạt động với tôi với một đường dẫn tương đối, nó tìm kiếm tệp trong %USERPROFILE%\$filePath
thay vì thư mục hiện tại (ít nhất là khi chạy từ Powershell ISE):
$text = [IO.File]::ReadAllText($filePath)
$text = Get-Content $filePath -Raw
[IO.File]::ReadAllText((Resolve-Path $filePath))
Một cách tiếp cận khác để đọc một tệp mà tôi tình cờ thích được gọi là ký hiệu biến hoặc cú pháp biến và chỉ liên quan đến việc bao gồm một tệp tin trong dấu ngoặc nhọn đứng trước dấu đô la, để hiểu:
$content = ${C:file.txt}
Ký hiệu này có thể được sử dụng như một giá trị L hoặc một giá trị R ; do đó, bạn có thể dễ dàng ghi vào một tệp có nội dung như sau:
${D:\path\to\file.txt} = $content
Một cách sử dụng hữu ích khác là bạn có thể sửa đổi tệp tại chỗ mà không cần tệp tạm thời và không có biểu thức phụ, ví dụ:
${C:file.txt} = ${C:file.txt} | select -skip 1
Tôi đã bị cuốn hút bởi ký hiệu này ban đầu vì rất khó để tìm hiểu bất cứ điều gì về nó! Ngay cả thông số kỹ thuật PowerShell 2.0 đề cập đến nó chỉ một lần hiển thị chỉ một dòng sử dụng nó - nhưng không có giải thích hoặc chi tiết sử dụng nào cả. Sau đó, tôi đã tìm thấy mục blog này về các biến PowerShell cung cấp một số thông tin chi tiết tốt.
Một lưu ý cuối cùng khi sử dụng điều này: bạn phải sử dụng ký hiệu ổ đĩa, tức là ${drive:filespec}
như tôi đã làm trong tất cả các ví dụ ở trên. Không có ổ đĩa (ví dụ ${file.txt}
) nó không hoạt động. Không có hạn chế nào đối với tệp tin trên ổ đĩa đó: nó có thể là tuyệt đối hoặc tương đối.
Get-Content lấy dữ liệu và đưa nó vào một mảng, từng dòng. Giả sử không có yêu cầu đặc biệt nào khác so với bạn đã liệt kê, bạn có thể lưu nội dung của mình vào một biến không?
$file = Get-Content c:\file\whatever.txt
Chỉ chạy $file
sẽ trả về nội dung đầy đủ. Sau đó, bạn chỉ có thể làm $file.Count
(vì mảng đã có sẵn một phương thức đếm) để lấy tổng số dòng.
Hi vọng điêu nay co ich! Tôi không phải là thuật sĩ viết kịch bản, nhưng điều này có vẻ dễ dàng hơn với tôi so với rất nhiều thứ ở trên.
$content = [IO.File]::ReadAllText(".\test.txt")
dường như làm điều tương tự như$content = (gc ".\test.txt" | out-string)
. Vì giây thứ hai ngắn hơn, đó là điều tôi thích. Thật không may, cả hai phương pháp bạn đã cung cấp để tính tổng số dòng đều không tính đến các dòng trống ở cuối. Bất kỳ ý tưởng nào khác?