如何解决如何替换多个文本文件中的值并使用Powershell脚本通过循环移动文件
我的文件包含以下数据(无标题)。让我们取2个文件
b1.txt
DEPOSIT ADD 123456789 (VALUE)(VARIABLE) NNNN VALUEVARIABLE
DEPOSIT ADD 234567890 (VALUE)(P75) NNNN VALUEVARIABLE
b2.txt
DEPOSIT ADD 345678901 (VALUE)(P75) NNNN VALUEVARIABLE
这些是制表符分隔的文本文件。每个文件中共有5列。 (123456789(VALUE)(VARIABLE)是一个单值列)。
我的要求是:
- 我只需要提取包含P75的行即可在 同一文件。
- 获取后,我必须替换Col3,Col4和Col5中的值 P75其他行应不受影响。
- 我必须在同一文件夹中更新具有相同配置的多个文件。
- 只有包含P75的记录才应这样更新。的 所有选定记录的替换值都相同。
- 更换后,我必须将其复制到位置1并将其移动 文件到location2
我的脚本的try命令如下。
$CurrFilePath : C:\testing
$TransIncludePattern =b*.txt
try
{ #Get-ChildItem -Path $CurrFilePath\* -Include $TransIncludePattern | sort LastWriteTime | Select-Object -First 1 | ForEach-Object {
$CurrFileName = Get-childitem -Path $CurrFilePath\* -Include $TransIncludePattern | sort LastWriteTime
$CurrFileName |
select -ExpandProperty fullname |
foreach {
(Get-Content $_) |
ForEach-Object {If($_ -match '\(VALUE\)\(P75\)'){$_ -replace '\(VALUE\)\(P75\)','(VTG)(SPVTG)' -replace 'VALUEVARIABLE','VTGSPVTG' -replace 'NNNN','TCM'} else {$_} | Set-Content $_
Write-Host "File Changed : " $_
}
}
Write-Host "P75 values are now replaced"
Copy-Item $CurrFileName -Destination $OutFilePath -force
Move-Item -CurrFileName $file -Destination $ProcessFilePath
Write-Host "Total Elapsed Time: $($elapsed.Elapsed.ToString())"
EXIT 0
}
我收到错误消息:
+ ... -replace 'NNNN','TCM'} else {$_} | Set-Con ...
+ ~
An empty pipe element is not allowed.
+ CategoryInfo : ParserError: (:) [],ParseException
+ FullyQualifiedErrorId : EmptyPipeElement
如何在不出现此错误的情况下满足我的要求?
请咨询。
谢谢
解决方法
首先,您的代码格式不正确且不可读。使用缩进,正确的日志记录(写主机或写输出)和换行符。 正确的代码调试始于阅读您刚刚创建的代码:) 引号中包含的路径和模式更安全。
对于代码本身-无需检查行是否与正则表达式匹配。如果正确,则-replace更改值,如果不更改,则-lane保持不变。 您在那里做了一个双foreach,所以引入了一个空管道。
$CurrFilePath = "C:\SomePath"
$TransIncludePattern = "b*.txt"
try {
#Get-ChildItem -Path $CurrFilePath\* -Include $TransIncludePattern | sort LastWriteTime | Select-Object -First 1 | ForEach-Object {
$CurrFileName = Get-childitem -Path $CurrFilePath\* -Include $TransIncludePattern | Sort-Object LastWriteTime;
$CurrFileName |
Select-Object -ExpandProperty FullName |
ForEach-Object {
Write-Host "Changing file $_";
$content = (Get-Content $_);
$newContent = $content | ForEach-Object {
((($_ -replace '\(VALUE\)\(P75\)','(VTG)(SPVTG)') -replace 'VALUEVARIABLE','VTGSPVTG') -replace 'NNNN','TCM');
}
$newContent | Set-Content $_; #or [IO.File]::WriteAllLines($_,$newContent) :)
Write-Host "File Changed: $_";
}
Write-Host "P75 values are now replaced";
Copy-Item $CurrFileName -Destination $OutFilePath -Force;
Move-Item -CurrFileName $file -Destination $ProcessFilePath;
Write-Host "Total Elapsed Time: $($elapsed.Elapsed.ToString())";
exit 0;
}
catch {
Write-Error $_;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。