使用PowerShell进行INI编辑

时间:2017-07-12 21:23:38

标签: powershell replace path ini

我的问题是我想更改保存在文件夹及其子文件夹中的INI文件中的路径。

文件夹的路径为C:\New\Path\

示例INI文件:

notAIniText = C:\A\Path\notAIniText
maybeAIniText = C:\A\Path\maybeAIniText
AIniText = C:\A\Path\AIniText

我读了一些关于PSini的其他问题,但我不想只是因为我想在多台PC上使用该脚本,而且我不想每次都安装PSIni。

我试过了:

$mabyIni = "C:\New\Path"
$AiniFile = Get-ChildItem - Path "C:\New\Path\*" -Include *.ini -Recurse
foreach ($file in $AiniFile) {
    Select-String -Path $file -AllMatches "C:\A\Path\" | ForEach-Opject {
        $file -replace [regex]:Escape('C:\A\Path'), ('$mabyIni')
    } | Set-Content $mabyIni -Include *.ini

但这不起作用。我也尝试使用Get-Content,但这也不起作用。

有没有办法使用PSini?

1 个答案:

答案 0 :(得分:2)

评论中的代码很接近,但只是有一些语法问题。它开始强大:

$mabyIni = "C:\New\Path" 
$AiniFile = Get-ChildItem - Path "C:\New\Path*" -include *.ini -recurse 
ForEach($file in $AiniFile) { 

到目前为止,这么好。您定义新路径,并在旧路径中获得.ini文件列表,然后开始循环遍历这些文件。到目前为止,这都是很好的代码。然后事情开始误入歧途。

我看到你正在尝试获取每个.ini文件的内容,替换有问题的字符串,然后将该文件输出到新路径:

    (Get-Content $AiniFile.PSPath) | ForEach-Object {
        $file -replace [regex]:Escape('C:\A\Path'),('$mabyIni') 
    }| Set-Content $mabyIni -include *.ini

不幸的是,您使用了错误的变量,并在其中添加了额外的ForEach循环。让我们从Get-Content行开始吧。在脚本的这一点上,您循环遍历文件,每个当前文件由$file表示。所以你真正希望获得的内容是$file,而不是$AiniFile.PSPath

    (Get-Content $file)

好的,这让我们将该文件的内容作为一个字符串数组。现在,我猜你不知道,但-Replace运算符适用于字符串数组。完美,我们碰巧得到了一系列字符串!由于Get-Content命令包含在括号中,因此它首先完成,我们实际上可以直接使用-Replace命令。

    (Get-Content $file) -replace [regex]:Escape('C:\A\Path'),$mabyIni

你所拥有的-replace命令非常接近!事实上,我必须为你提供使用[regex]::escape()的道具。这完全是一个亲的举动,干得好!唯一的问题是替换字符串不需要在括号中,它是单引号,所以它不会扩展字符串,你的.ini文件将有一行像:

AIniText = $mabyIni\AIniText

不完全是你想要的我猜,所以我删除了括号(它们没有伤害任何东西,但也没有帮助,所以为了清洁和简单我摆脱它们),我摆脱了单引号'也是因为我们真的只想要存储在该变量中的字符串。

所以现在我们循环遍历文件,读取内容,用新路径替换旧路径,剩下的就是输出新的.ini文件。看起来它们已经就位,所以我们只使用文件的现有路径,并将内容设置为更新的数据。

    (Get-Content $file) -replace [regex]:Escape('C:\A\Path'),$mabyIni | Set-Content -Path $File.FullName

好的,完成了!您只需关闭ForEach循环,然后运行它。

$mabyIni = "C:\New\Path" 
$AiniFile = Get-ChildItem - Path "C:\New\Path*" -include *.ini -recurse 
ForEach($file in $AiniFile) { 
    (Get-Content $file) -replace [regex]:Escape('C:\A\Path'),$mabyIni | Set-Content -Path $File.FullName
}