Сохранение файла XML в powershell требует полного пути. Зачем? - PullRequest
46 голосов
/ 28 января 2011

Я использую XML-возможности powershell для изменения файла .config.Вызов XMLDocument.Save не имеет никакого эффекта, если я не предоставлю полное имя пути.

# 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));

Почему не работает $ config.Save ("web.config")?

Я закончил тем, что сохранил это где-нибудь еще, кроме моего локального каталога?

Ответы [ 2 ]

64 голосов
/ 29 января 2011

Причина в том, что текущий рабочий каталог в powershell не обязательно совпадает с рабочим каталогом процесса.

Это связано с тем, что рабочее направление powershell (Get-Location) может использовать другую файловую системупровайдеры - такие как реестр или сертификаты.Кроме того, поскольку powershell может иметь несколько пространств выполнения, у каждого из них может быть свой текущий рабочий каталог.

Для этого есть два обходных пути.

Один из них - использовать Resolve-Path (Resolve-Path "orders.xml"), хотя этопроверит существование до возврата значения, поэтому при создании новых файлов это может быть проблемой.Другой вариант - использовать псевдоним get-location: $pwd, например ("$pwd\orders.xml")

Так что для вашего примера вы можете изменить строку 2 на

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

или

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

и соответственно строка 12 будет

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

или

$config.Save("$pwd\web.config");
25 голосов
/ 28 января 2011

Если бы он не пошел в текущий рабочий каталог, я бы проверил $ ​​home.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...