获得以下脚本,我认为可以高兴地分别更新每个C:\users\*\AppData\Local\Greeentram
文件夹中指定的.ini文件。
function Set-OrAddIniValue {
Param(
[string]$FilePath,
[hashtable]$keyValueList
)
$content = Get-Content $FilePath
$keyValueList.GetEnumerator() | ForEach-Object {
if ($content -match "^$($_.Key)=") {
$content= $content -replace "^$($_.Key)=(.*)", "$($_.Key)=$($_.Value)"
} else {
$content += "$($_.Key)=$($_.Value)"
}
}
$content | Set-Content $FilePath
}
Set-OrAddIniValue -FilePath "C:\Users\*\AppData\Local\Greentram\SDA_Apps.ini" -keyValueList @{
UserName = "Dcebtcv7[[G"
UserEmail = "x}tpwpjmkxmvkYjmklzmx7zv7lr"
UserNo = "*++*(+"
UserKey = "^X(_0[*_/0L)\_0,U,-"
KEM = "H10"
}
它似乎正在做的是以某种方式将所有.INI文件组合在一起并为每个用户创建一个新的.INI文件。
我错误地认为C:\Users\*\AppData\Local\Greentram\SDA_Apps.ini
会起作用。
我只想更新或将这些特定值添加到每个.INI文件中。
Set-OrAddIniValue -FilePath "C:\Users\*\AppData\Local\Greentram\SDA_Apps.ini" -keyValueList @{
UserName = "Dcebtcv7[[G"
UserEmail = "x}tpwpjmkxmvkYjmklzmx7zv7lr"
UserNo = "*++*(+"
UserKey = "^X(_0[*_/0L)\_0,U,-"
KEM = "H10"
}
答案 0 :(得分:2)
您的函数Set-OrAddIniValue
无法处理路径中的通配符。
$content = Get-Content $FilePath
...
$content | Set-Content $FilePath
第一个语句将所有匹配文件的内容读入单个数组。然后,第二个语句将整个修改后的内容写入所有匹配的文件。 (它将如何决定哪个内容属于哪个文件?)
您可以单独为每个文件调用函数:
Get-ChildItem "C:\Users\*\AppData\Local\Greentram\SDA_Apps.ini" | ForEach-Object {
Set-OrAddIniValue -FilePath $_.FullName -keyValueList ...
}
或更改您的函数,以便它在内部进行枚举:
function Set-OrAddIniValue {
Param(
[string]$FilePath,
[hashtable]$keyValueList
)
Get-ChildItem $FilePath | Where-Object {
-not $_.PSIsContainer # process only files
} | ForEach-Object {
$file = $_.FullName
$content = Get-Content $file
...
$content | Set-Content $file
}
}
在PowerShell v3及更新版本上,您可以使用Get-ChildItem -File
而不是通过Where-Object {-not $_.PSIsContainer}
管道对象列表。