2017-07-23 17 views
7

Tệp cấu hình ban đầu của tôi (web1.config) không có dòng thừa và khi được xem trong notepad (hiển thị tất cả ký tự) trông như sau:Thiết lập nội dung nối thêm dòng mới (ngắt dòng, CRLF) ở cuối tệp của tôi

enter image description here

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
    <compilation debug="true" targetFramework="4.6" /> 
    <httpRuntime targetFramework="4.6" /> 
    </system.web> 
    <appSettings> 
    <add key="myConnectionString" value="server=localhost;database=myDb;uid=myUser;password=myPass;" /> 
    </appSettings> 
</configuration> 

Bây giờ, tôi cần phải áp dụng các lệnh để thay đổi tên cơ sở dữ liệu của tôi để cái gì khác mà trông giống như:

Move-Item "web1.config" "webtemp.config" 
Get-Content "webtemp.config" | ForEach-Object {$_ -replace "database=myDb;", "database=newDb;"} |Set-Content "web1.config" -Force 
Remove-Item "webtemp.config" 
Write-Output('Settings Changed') 

Vì vậy, các tập tin mới (web1.config) được tạo ra trông s như:

enter image description here

Thông báo dòng phụ thêm vào cuối của tập tin (mà là hoàn toàn không cần thiết) Tôi đã thử tất cả các lựa chọn khác như: - sử dụng ra-file api - sử dụng. phương pháp IO mạng System.IO.StreamWriter - sử dụng cờ -nonewline (nó chuyển đổi tất cả 10 dòng thành một dòng) - sử dụng các tùy chọn mã hóa khác nhau - đã thử thay thế \ r \ n thành \ r (không hoạt động trở lại) nội dung tạo ra crlf luôn)

Tôi đang sử dụng PowerShell phiên bản 5.1.

+0

Cho phép tôi cung cấp cho bạn lời khuyên chuẩn cho người mới: Nếu câu trả lời giải quyết được vấn đề của bạn, vui lòng chấp nhận câu trả lời bằng cách nhấp vào dấu kiểm lớn (✓) bên cạnh nó và tùy ý bỏ phiếu. điểm danh tiếng hơn). Nếu bạn thấy các câu trả lời khác hữu ích, hãy bỏ phiếu cho họ. Chấp nhận (bạn sẽ nhận được 2 điểm danh tiếng) và bỏ phiếu ủng hộ độc giả trong tương lai. Vui lòng xem [bài viết có liên quan trong trung tâm trợ giúp] (http://stackoverflow.com/help/someone-answers). Nếu câu hỏi của bạn chưa được trả lời đầy đủ, vui lòng cung cấp phản hồi hoặc [tự trả lời] (http://stackoverflow.com/help/self-answer). – mklement0

Trả lời

1

tôi không bao giờ nhận thấy điều này, vì vậy tôi đã làm một tìm kiếm nhanh và thấy:

set-content adds newlines by default

Các giải pháp được đề xuất là để mã hóa nội dung của bạn để byte và sau đó sử dụng Set-Tự tin với tham số -Encoding.

Set-Content test.txt ([byte[]][char[]] "test") -Encoding Byte 

Tôi đã tự mình thử nghiệm để tôi có thể xác nhận rằng tính năng này hoạt động.

+1

Tìm kiếm/trả lời hay nhất +1. Chỉ cần đề cập đến điều này hoạt động giống nhau trên PowerShell 6.0.0beta4 trên Linux/Darwin ngoài việc bổ sung lf '0A' – LotPings

+0

Giải pháp này đi kèm với một cảnh báo trước: về cơ bản nó tạo ra một tệp mã hóa ISO-8859-1 một byte (ISO-8859-1 phần lớn, nhưng không hoàn toàn tương thích với trang mã Windows được sử dụng rộng rãi nhất, Windows-1252), có nghĩa là (a) bạn không thể chọn mã hóa đầu ra khác và (b) giải pháp ngắt bằng chuỗi chứa ký tự không thuộc ISO-8859 -1, chẳng hạn như '€': Lệnh sau _breaks_, ví dụ: 'Set-Content test.txt ([byte []] [char []]" € ") -Kích hoạt Byte' – mklement0

+1

@LotPings: Giải pháp này không nối thêm _anything_, là điểm (ngược lại, bất kỳ dấu ngắt dòng nào _already hiện diện trong input_ có khả năng là chỉ LF trên nền tảng Unix). Tuy nhiên, như đã nêu, giải pháp này là vấn đề từ góc độ mã hóa. – mklement0

4

tl; dr:

(Get-Content "webtemp.config" | ForEach-Object { 
    $_ -replace "database=myDb;", "database=newDb;" 
}) -join "`n" | Set-Content -NoNewline -Force "web1.config" 

Lưu ý: Thay thế "`n" với "`r`n" nếu bạn muốn Windows theo phong cách kết thúc dòng CRLF chứ không phải là Unix-phong cách kết thúc dòng LF-only (PowerShell và nhiều tiện ích có thể xử lý cả hai).


Trong PSv5 +, Set-Content hỗ trợ -NoNewline switch, mà chỉ thị Set-Content không để thêm một dòng mới (ngắt dòng) sau mỗi đối tượng đầu vào. Điều tương tự cũng áp dụng tương tự với các lệnh ghép ngắn Add-ContentOut-File.

Nói cách khác: Set-Content -NoNewlinetrực tiếp concatenates cơ quan đại diện chuỗi của tất cả các đối tượng đầu vào của nó:

> 'one', 'two' | Set-Content -NoNewline tmp.txt; Get-Content tmp.txt 
onetwo 

Nếu bạn đang đi để Set-Content -NoNewline là một chuỗi đơn rằng đã có nhúng newlines, bạn có thể sử dụng nó như hiện tại và nhận kết quả mong muốn:

> "one`ntwo" | Set-Content -NoNewline tmp.txt; "$(Get-Content -Raw tmp.txt)?" 
one 
two? 

Lưu ý rằng Get-Content -Raw đọc file như một toàn thể, như nó vốn có (ngoài nhân vật giải mã) và thực tế là các ? xuất hiện trực tiếp sau khi two ngụ ý rằng tập tin không có ký tự dòng mới.

Trong trường hợp của bạn, vì bạn đang xử lý dòng đầu vào từng người một (thông qua Get-Contentmà không-Raw) và do đó xuất ra một mảng dòng (chuỗi), trước tiên bạn phải tham gia cùng họ với một dòng mới dưới dạng phân tách - chỉ giữa dòng - và chuyển kết quả đến Set-Content -NoNewline, như được hiển thị ở trên cùng; đây là một ví dụ đơn giản:

> ('one', 'two') -join "`n" | Set-Content -NoNewline tmp.txt; "$(Get-Content -Raw tmp.txt)?" 
one 
two? 

'one', 'two' là hai yếu tố chuỗi mảng đó là một stand-in cho lệnh xử lý line-by-line của bạn.

Encoding lưu ý:

Trong Windows PowerShell, Set-Content sản xuất "ANSI" file -encoded theo mặc định, dựa trên, trang mã single-byte di sản của hệ thống.
Để kiểm soát mã hóa một cách rõ ràng, hãy sử dụng tham số -Encoding.


Trong PSv4-, một giải pháp mà sử dụng .NET Framework là cần thiết:

> [System.IO.File]::WriteAllText('tmp.txt', ('one', 'two') -join "`n"); "$(Get-Content -Raw tmp.txt)?" 
one 
two? 

Lưu ý rằng [System.IO.File]::WriteAllText(), trong sự vắng mặt của một cuộc tranh cãi mã hóa, mặc định là BOM-less UTF- số 8.
Vượt qua trường hợp mã hóa [System.Text.Encoding] mong muốn làm đối số thứ 3 nếu cần.

Các vấn đề liên quan