我的问题是我想更改保存在文件夹及其子文件夹中的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?
答案 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
}