Powershell 如何在固定位置替换多个文本文件中的日期,但仅当原始日期来自上个月时

Powershell 如何在固定位置替换多个文本文件中的日期,但仅当原始日期来自上个月时,powershell,scripting,Powershell,Scripting,我越来越擅长在powershell中编写脚本,但我仍然是一名新手,我很难找到解决方案 我有一组文本文件(没有结尾)从金融系统导出到“in”文件夹中。 内容的行始终具有相同的结构和长度 在每行的72-77字符位置,是YYMMDD格式的日期。 我需要用一个固定值替换这个日期:YY=实际年份,MM=实际月份,DD=01 但前提是原始日期是上个月的日期。 然后我必须将所有修改过的文件写入“out”文件夹 数据的外观: 0020107998000000000000000000771930867290000

我越来越擅长在powershell中编写脚本,但我仍然是一名新手,我很难找到解决方案

我有一组文本文件(没有结尾)从金融系统导出到“in”文件夹中。 内容的行始终具有相同的结构和长度

在每行的72-77字符位置,是YYMMDD格式的日期。 我需要用一个固定值替换这个日期:YY=实际年份,MM=实际月份,DD=01 但前提是原始日期是上个月的日期。 然后我必须将所有修改过的文件写入“out”文件夹

数据的外观:

00201079980000000000000000007719308672900000286850040040014092914092914093000923000100000000000000

我需要将“140930”(字符位置72-77)替换为“141001”,因为9月(09)已经过去了。

在PowerShell中肯定有这样做的方法,虽然我(和许多其他人)可以帮助您编写脚本来完成这一任务,但我建议您下载PowerShell社区扩展。它现在(截至2014年10月24日)包含了一个名为Edit File的cmdlet,该cmdlet完全满足您的要求。这可以简单到:

get-childitem c:\path\to\files\*.txt |
    Where{(Get-Content $_.FullName -TotalCount 1).substring(73,2) -lt (get-date -f "MM")}|
        Edit-File -pattern '(?s)((?<=^.{71})\d{6})' -replacement (Get-date -f "yyMM01") -force
get childitem c:\path\to\files\*.txt|
其中{(getcontent$\.FullName-TotalCount 1).substring(73,2)-lt(getdate-f“MM”)}|

编辑文件-模式“(?谢谢@Paul和@TheMadTechnician。 我确实看了一下.substring(),然后想出了这个,它工作得很好。 现在我还有一个问题:
始终不应处理每个文件的最后一行,如何以最简单的方式处理

$PathIn=“C:\in\”
$PathOut=“C:\out\”
获取子项$PathIn*-递归|
Foreach对象{
$file=($|获取内容)
写主机$_
$CompletePathOut=$PathOut+$_
$LineNumber=1
foreach($文件中的行)
{
$LineNumber++
$OrigValutaDate=$line.Substring(71,6)
$Before=$line.Substring(0,71)
$After=$line.Substring(77)
$d=获取日期
if($OrigValutaDate.Substring(2,2)-ne($d.Month.ToString())
{
$NewValutaDate=($d.Year).ToString().Substring(2,2)+($d.Month).ToString()+“01”
$out=$Before+$newvalutate+$After
}
其他的
{
$out=$Before+$OrigValutaDate+$After
}
如果($out-eq$line){写入主机$LineNumber“Valutadate original”}否则{写入主机$LineNumber“Valutadate replacement”}
$out | out file-filepath$CompletePathOut-append
}

}
看看string对象的
.substring()
方法,它应该允许您获取所需的数据。然后将其与参考日期进行比较,如果您希望替换它,则始终不应处理每个文件的最后一行,我如何在上面的脚本中以最简单的方式执行此操作?