Подтвердить что ты не робот

Для сохранения XML файла в powershell требуется полный путь. Зачем?

Я использую возможности 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" )?

Я в конечном итоге сохранил его в другом месте, кроме моего локального каталога?

4b9b3361

Ответ 1

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

Ответ 2

Причина в том, что текущий рабочий каталог в 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");