动态替换来自 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
我有一个 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