动态替换来自 import-csv 的字符串

Dynamic replacement of strings from import-csv

我有一个 csv 文件,其中包含的字段的值以“$”开头,代表不同 powershell 脚本中的变量。我正在尝试导入 csv,然后用脚本中的实际变量替换变量的字符串版本(例如“$var1”)。我已经能够从输入中分离出适当的字符串,但我在修改值时遇到困难。

示例:

CSV 输入文件 -

In Server,Out Server
\$var1\in_Company1,\$var2\in_Company1
\$var1\in_Company2,\$var2\in_Company2

脚本(到目前为止)-

$Import=import-csv "C:\temp\test1.csv"
$Var1="\server1"
$Var2="\server2"
$matchstring="(?=$)(.*?)(?=\)"
$Import| %{$_ | gm -MemberType NoteProperty | 
%{[regex]::matches($Import.$($_.name),"$matchstring")[0].value}}

关于如何实现这一点有什么想法吗?

我能想到的解决这个问题的最简单方法是使用变量扩展来替换。您在 CSV 中设置了变量,因此让我们将它们扩展为脚本中各自的值。

#  If you dont have PowerShell 3.0 -raw will not work use this instead
#  $Import=Get-Content $path | Out-String

$path = "C:\temp\test1.csv"
$Import = Get-Content $path -Raw
$Var1="\server1"
$Var2="\server2"
$ExecutionContext.InvokeCommand.ExpandString($Import) | Set-Content $path

这将在 $path

中生成以下输出
In Server,Out Server
\\server1\in_Company1,\\server2\in_Company1
\\server1\in_Company2,\\server2\in_Company2

如果此处的斜杠加倍,而您不希望它们加倍,则只需更改 CSV 数据脚本中的相应变量值即可。

警告

这也有可能执行您并非故意的恶意代码。查看此线程以了解有关 Expanding variables in file contents 的更多信息。如果您对风险感到满意,那么所提供的这个解决方案应该没问题。

可能是我理解错了,你需要这个吗?

$Import=import-csv "C:\temp\test1.cvs"
$Var1="\server1"
$Var2="\server2" 

Foreach ($row in $Import )
{
    $row.'In Server' = ($row.'In Server' -replace '\\$var1', "$var1")
    $row.'Out Server' = ($row.'Out Server' -replace '\\$var2', "$var2")    
}

$import | set-content $path