我正在使用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”)不起作用?
除了我的本地目录外,我最终是否将其保存在其他地方?
答案 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。