在powershell中保存XML文件需要完整的路径。为什么?

时间:2011-01-27 22:17:08

标签: xml powershell

我正在使用powershell的XML功能来修改.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 个答案:

答案 0 :(得分:63)

原因是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");

答案 1 :(得分:24)

如果它没有进入当前工作目录,我会检查$ home。