我想替代所有我想要的东西吗?

时间:2019-12-06 12:29:52

标签: powershell text replace parameters

我需要2个.txt文件作为参数。 database.txt如下所示(格式:名称,地址,日期):
迈克尔,12月24日在随机街1号。
艾伦,12月24日在随机街2号。
凯文,12月24日在随机街3号。

text.txt文件看起来像一封电子邮件,但重要的部分是:
名称:/ name /
地址:/ address /
日期:/ date /

我需要为database.txt的每一行显示text.txt。 这是我的代码:

param ( [Parameter(Mandatory=$True)][string] $textfile,
        [Parameter(Mandatory=$True)][string] $datafile )
$text = get-content .\$textfile
$data = get-content .\$datafile
$name = ($data.Split(",")[0])
$address = ($data.Split(",")[1])
$date = ($data.Split(",")[2])

foreach ($line in $textfile){

    $text -replace '/name/',$name
    $text -replace '/address/',$address
    $text -replace '/date/',$date
}

输出看起来像这样:

姓名:Michael
地址:/ address /
日期:/ date /

名称:/ name /
地址:随机街1
日期:/ date /

名称:/ name /
地址:/ address /
日期:12月24日。

应该是这样的:

姓名:Michael
地址:随机街1
日期:12月24日

名称:Allen
地址:随机街2
日期:12月24日

名称:Kevin
地址:随机街3
日期:12月24日。

因此我的代码仅识别第一行,并在不同时间替换数据。我该如何解决该问题?我认为我的foreach和/或拆分与之有关。
我真的对Powershell陌生,因此请尝试使解决方案尽可能简单。谢谢。

2 个答案:

答案 0 :(得分:3)

考虑以下示例:

$text = @"
Name: /name/
Address: /address/
Date: /date/
"@


$data = @"
Michael,random street 1,dec.24.
Allen,random street 2,dec.24.
Kevin,random street 3,dec.24.
"@

# Split the data into lines
$DataLines = $data -split "`n"

foreach ($line in $dataLines){
    $name = ($line.Split(",")[0])
    $address = ($line.Split(",")[1])
    $date = ($line.Split(",")[2])

    $text -replace '/name/',$name -replace '/address/',$address -replace '/date/',$date
}

出于演示目的,我将内容直接放在$text$data变量中,但这是您的变量在加载时将包含的内容。

您的初始脚本有两个问题。

  1. 您要遍历数据条目(每行数据)而不是文本文件。

-

 $DataLines = $data -split "`n"

foreach ($line in $dataLines){
    $name = ($line.Split(",")[0])
    $address = ($line.Split(",")[1])
    $date = ($line.Split(",")[2])
    #replace here
}
  1. 您想输出1个文本而不是3个

在执行替换操作后,replace语句在控制台中输出完整的字符串。 原始变量未修改。

foreach ($line in $textfile){

    $text -replace '/name/',$name
    $text -replace '/address/',$address
    $text -replace '/date/',$date
}

基本上,您将创建文本的3个版本。 一种仅替换名称,一种仅替换地址,一种仅替换日期。

您要么需要全部完成一行操作

$text -replace '/name/',$name -replace '/address/',$address -replace '/date/',$date

或将每个替换操作的结果分配给一个变量,您可以在后续调用中重用该变量:

$MyTextOutput = $text -replace '/name/',$name 
$MyTextOutput = $MyTextOutput -replace '/address/',$address 
$MyTextOutput = $MyTextOutput -replace '/date/',$date
$MyTextOutput

答案 1 :(得分:0)

在我看来,这就像一个csv:

$text = get-content text.txt
import-csv database.txt -header name,address,date | foreach {
  $text -replace '/name/',$_.name -replace '/address/',$_.address -replace '/date/',$_.date
}