2011-01-27 30 views
35

Tôi đang sử dụng khả năng XML của PowerShell để sửa đổi tệp .config. Gọi XMLDocument.Save không có bất kỳ ảnh hưởng nào, trừ khi tôi cung cấp tên đường dẫn đầy đủ.Lưu tệp XML trong PowerShell yêu cầu đường dẫn đầy đủ. Tại sao?

# Open the xml file 
$config = [xml](get-content web.config) 
# 
# modify the XML 
$config.SelectNodes("./configuration/connectionStrings/add[@name='LocalSqlServer']") | % { $connNode = $_ } 
$connNode.connectionString = $connNode.connectionString -replace '^(.*)Server=[^;]+(.*)$', '$1Server=192.168.5.2$2' 
# 
# 
# Now I save it again 
# 
# This doesn't save it! 
$config.Save("web.config"); 
# However, this works 
$config.Save("{0}\\web.config" -f (get-location)); 

Tại sao $ config.Save ("web.config") không hoạt động?

Tôi đã lưu nó ở một nơi khác, khác với thư mục địa phương của tôi?

+0

$ home trỏ đến điểm nào? Cần có –

+0

bất kỳ giải pháp nào có mã nguồn đầy đủ về nó? – Kiquenet

Trả lời

47

Lý do là vì thư mục làm việc hiện tại trong PowerShell không cần thiết giống như thư mục làm việc quy trình.

Điều này là do hướng hoạt động của powerhell (Get-Location) có thể sử dụng các nhà cung cấp hệ thống tệp khác nhau - chẳng hạn như Registry hoặc Chứng chỉ. Cũng bởi vì powershell có thể có nhiều không gian chạy, mỗi một có thể có thư mục làm việc hiện tại của riêng mình.

Có hai cách giải quyết cho vấn đề này.

Một là sử dụng Resolve-Path(Resolve-Path "orders.xml"), mặc dù điều này sẽ kiểm tra sự tồn tại trước khi trả về giá trị, vì vậy để tạo tệp mới, điều này có thể là một vấn đề. Các tùy chọn khác là sử dụng bí danh của get-vị trí: $pwd ví dụ ("$pwd\orders.xml")

Vì vậy, ví dụ của bạn, bạn có thể hoặc thay đổi dòng 2 là

$config = [xml](get-content (Resolve-Path "web.config")) 

hoặc

$config = [xml](get-content "$pwd\web.config") 

và tôn trọng dòng 12 là

$config.Save((Resolve-Path "web.config")); 

hoặc

$config.Save("$pwd\web.config"); 
+1

Bạn, thưa ông, đã cứu ngày của tôi! Đối với 3 điều nhỏ nhặt tôi muốn làm. –

22

Nếu nó không đi đến thư mục làm việc hiện tại, tôi sẽ kiểm tra $ home.

+2

Và đó là nơi nó đã được. :-) –

+9

Set-Location (aka cd) trong PowerShell không thay đổi thư mục hiện tại được bảo trì bởi hệ điều hành, vì vậy thư mục hiện tại thường ở bất cứ đâu khi bạn khởi động PowerShell. Nếu bạn muốn thay đổi thư mục hiện tại, bạn có thể đặt thuộc tính [Môi trường] :: CurrentDirectory. – OldFart

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