如何使用Powershell更改文件内容并将其保存到另一个文件?

时间:2018-07-18 09:29:34

标签: powershell

我想这样做

  • 读取文件
  • 遍历每一行
  • 如果该行与模式匹配,请对该行进行一些更改
  • 将内容保存到另一个文件

现在我使用此脚本:

$file = [System.IO.File]::ReadLines("C:\path\to\some\file1.txt")
$output = "C:\path\to\some\file2.txt"

ForEach ($line in $file) {
    if($line -match 'some_regex_expression') {
        $line = $line.replace("some","great")
    }
    Out-File -append -filepath $output -inputobject $line
}

如您所见,我在这里一行一行地写。是否可以一次写入整个文件?

提供了很好的例子here

(Get-Content c:\temp\test.txt) -replace '\[MYID\]', 'MyValue' | Set-Content c:\temp\test.txt

但是我的问题是我还有其他IF语句...

那么,我该怎么做才能改善脚本?

3 个答案:

答案 0 :(得分:1)

您可以这样做:

Get-Content -Path "C:\path\to\some\file1.txt" | foreach {
    if($_ -match 'some_regex_expression') {
        $_.replace("some","great")
    }
    else {
        $_
    }
} | Out-File -filepath "C:\path\to\some\file2.txt"

默认情况下,Get-Content逐行读取文件(字符串数组),因此您可以将其通过管道传输到foreach循环中,处理循环中的每一行,然后将整个输出管道传输至file2.txt。

答案 1 :(得分:0)

在这种情况下,数组或数组列表(大型数组的列表更好)将是最优雅的解决方案。只需在数组中添加字符串,直到ForEach循环结束即可。之后,只需将数组刷新到文件即可。

这是数组列表示例

$file = [System.IO.File]::ReadLines("C:\path\to\some\file1.txt")
$output = "C:\path\to\some\file2.txt"
$outputData = New-Object System.Collections.ArrayList

ForEach ($line in $file) {
    if($line -match 'some_regex_expression') {
        $line = $line.replace("some","great")
    }
    $outputData.Add($line)
}
$outputData |Out-File $output

答案 2 :(得分:0)

我认为通过使用正则表达式组(例如salesorderdetails和占位符(例如var entity = {}; entity["salesorderid@odata.bind"] = "/salesorders(B4B625A1-3789-E811-A967-000D3A1A9407)"; var req = new XMLHttpRequest(); req.open("POST", Xrm.Page.context.getClientUrl() + "/api/data/v8.2/salesorderdetails", true); req.setRequestHeader("OData-MaxVersion", "4.0"); req.setRequestHeader("OData-Version", "4.0"); req.setRequestHeader("Accept", "application/json"); req.setRequestHeader("Content-Type", "application/json; charset=utf-8"); req.onreadystatechange = function() { if (this.readyState === 4) { req.onreadystatechange = null; if (this.status === 204) { var uri = this.getResponseHeader("OData-EntityId"); var regExp = /\(([^)]+)\)/; var matches = regExp.exec(uri); var newEntityId = matches[1]; } else { Xrm.Utility.alertDialog(this.statusText); } } }; req.send(JSON.stringify(entity)); if等),在很多情况下都可以避免使用(.*)语句。
如您的示例:

$1

对于很好的例子”,其中$2可能是内联的:

(Get-Content .\File1.txt) -Replace 'some(_regex_expression)', 'great$1' | Set-Content .\File2.txt

(另请参见How to replace first and last part of each line with powershell