我在PowerShell中的脚本编写越来越好,但我仍然是新手,我在寻找解决方案时遇到了问题..
我有一组文本文件(没有结尾)从" in"中的金融系统导出。夹。 内容的行总是具有相同的结构和长度。
在每个行的字符位置72-77是格式为YYMMDD的日期。 我需要用固定值替换这个日期:YY =实际年份,MM =实际月份,DD = 01 但前提是原始日期是过去一个月。 然后我必须将所有修改过的文件写入" out"文件夹中。
数据的外观如何:
00201079980000000000000000007719308672900000286850040040014092914092914093000923000100000000000000
我需要更换" 140930" (字符位置72-77)因为9月(09)已经过了" 141001"。
答案 0 :(得分:0)
在PowerShell中肯定有这样做的方法,虽然我(以及其他许多人)可以帮助您编写脚本来执行此操作,但我会建议您下载PowerShell社区扩展。它现在(截至2014年10月24日)有一个名为Edit-File的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
答案 1 :(得分:0)
谢谢@Paul和@TheMadTechnician。 我确实看过.substring()并想出了这个,它运行正常。 现在我还有一个问题: 始终不应处理每个文件的最后一行,如何以最简单的方式执行此操作?
$PathIn = "C:\in\"
$PathOut = "C:\out\"
Get-ChildItem $PathIn * -recurse |
Foreach-Object {
$file = ($_ | Get-Content)
write-host $_
$CompletePathOut = $PathOut + $_
$LineNumber = 1
foreach($line in $file)
{
$LineNumber++
$OrigValutaDate = $line.Substring(71,6)
$Before = $line.Substring(0,71)
$After = $line.Substring(77)
$d = Get-Date
if ($OrigValutaDate.Substring(2,2) -ne ($d.Month).ToString())
{
$NewValutaDate = ($d.Year).ToString().Substring(2,2) + ($d.Month).ToString() + "01"
$out = $Before + $NewValutaDate + $After
}
else
{
$out = $Before + $OrigValutaDate + $After
}
if ($out -eq $line) {write-host $LineNumber "Valutadate original"} else {write-host $LineNumber "Valutadate replaced"}
$out | out-file -filepath $CompletePathOut -append
}
}
&#13;