powershell - 我缺少什么来取代我想要的一切?

标签 powershell text replace parameters

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

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

我需要显示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
}

输出如下所示:

姓名:迈克尔
地址:/地址/
日期:/日期/

姓名:/姓名/
地址:随机街1号
日期:/日期/

姓名:/姓名/
地址:/地址/
日期:12月24日。

应该是这样的:

姓名:迈克尔
地址:随机街1号
日期:12月24日

姓名:艾伦
地址:随机街2号
日期:12月24日

姓名:凯文
地址:随机街3号
日期:12月24日。

所以我的代码仅识别第一行并在不同时间替换数据。我可以做什么来解决这个问题?我认为我的 foreach 和/或 split 与此有关。
我对 powershell 很陌生,所以请尽量让解决方案尽可能简单。谢谢。

最佳答案

考虑这个例子:

$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 变量中,但这就是您的变量在加载时包含的内容。

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

  1. 您想要迭代数据条目(每行数据)而不是文本文件。

--

 $DataLines = $data -split "`n"

foreach ($line in $dataLines){
    $name = ($line.Split(",")[0])
    $address = ($line.Split(",")[1])
    $date = ($line.Split(",")[2])
    #replace here
}
  • 您希望输出 1 个文本,而不是 3 个
  • 替换语句在替换操作后在控制台中输出完整的字符串。 原始变量没有被修改。

    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
    

    关于powershell - 我缺少什么来取代我想要的一切?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59213201/

    相关文章:

    python - 将双引号之间的空格替换为下划线

    arrays - 我如何有一个从 args 或 Powershell 管道中获取输入的数组参数?

    Powershell Rename-Item 一次性替换多个命名参数

    cocoa-touch - 文字输入ios问题

    .net - 为什么 InlineCollection 不提供索引器(无需转换)?

    crystal-reports - 替换功能在 Crystal Reports 中不起作用

    javascript - 在 Javascript 中查找和替换字符

    powershell - 将 MKS 替换为 Powershell

    powershell - 八达通中的"The Azure PowerShell session has not been properly initialized"错误消息

    C 随机,有问题