【问题标题】:INI editing with PowerShell使用 PowerShell 进行 INI 编辑
【发布时间】:2017-12-17 11:24:37
【问题描述】:

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

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

示例 INI 文件:

notANiText = C:\A\Path\notANiText maybeAIniText = C:\A\Path\maybeAIniText ANiText = C:\A\Path\ANiText

我阅读了一些关于 PSini 的其他问题,但我不想只是 id,因为我想在多台 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 吗?

【问题讨论】:

  • 它应该在ini文件中搜索路径并将其替换为新的。我也试过: $mabyIni = "C:\New\Path" $AiniFile = Get-ChildItem - Path "C:\New\Path*" -include *.ini -recurse ForEach($AiniFile 中的$file) { (Get -内容 $AiniFile.PSPath) | ForEach-Opject {$file -replace [regex]:Escape('C:\A\Path'),('$mabyIni') }|设置内容 $mabyIni -include *.ini
  • 您应该更新您的问题,而不是发表评论。您评论中的代码真的很难阅读。无论如何,我在你的评论中看到了代码的问题,我会写一个关于为什么它不起作用的答案。

标签: powershell replace path ini


【解决方案1】:

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

$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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多