我有一堆文件需要更换内容,例如哪里有' AA'我需要替换为' E1',' A1'与' P4'。需要在不同文件中以不同方式更改相同内容。例如,在第二个文件中,AA' AA'会成为' P1'' A1'将成为' E1'等。为了实现这一点,我有一个包含2列的Excel表格,如下所示:
TC CodeChange 086 AA-E1; A1-P2 099 AA-P2; A1-E1; A2-E2; Z3-E3 100 AA-P2; A1-E2; A2-E3; Z3-O3
我为上面写的PowerShell脚本:
脚本1:
function func3 {
Param($arr3, $pat)
$arr3.GetEnumerator() | ?{$_.key -like $pat} | ForEach-Object {
$output = $_.value
return $output
}
}
$src = "C:\...xlsx"
$src1 = "C:\...\..."
$sheetName = "Sheet1"
$arr = @{};
$objExcel = New-Object -ComObject Excel.Application
$workbook = $objExcel.Workbooks.Open($src)
$sheet = $workbook.Worksheets.Item($sheetName)
$objExcel.Visible = $false
$rowMax = ($sheet.UsedRange.Rows).count
$rowTC, $colTC = 1, 1
$rowCodeChange, $colCodeChange = 1, 2
for ($i=1; $i -le $rowMax-1; $i++) {
$TC = $sheet.Cells.Item($rowTC+$i, $colTC).Text
$CodeChg = [String]($sheet.Cells.Item($rowCodeChange+$i, $colCodeChange).Text)
if ($arr.ContainsKey($TC) -eq $false) {
$arr.Add($TC, $CodeChg)
}
}
$inputfiles = (Get-ChildItem -Path $src1 -Recurse)
foreach ($inputfile in $inputfiles) {
$pat1 = $inputfile.Name.SubString(8, 3)
$val = func3 $arr $pat1
$arry1 = $val -split ';'
Write-Host $arry1.Length
$j = 0
do {
#skipping these 3 items from getting replaced
if (($arry1[$j].Trim() -ne "S1") -and ($arry1[$j].Trim() -ne "S2") -and ($arry1[$j].Trim() -ne "S3")) {
(Get-Content $inputfile.FullName) | ForEach-Object {
$_ -replace "$($arry1[$j].Split('-')[0])","$($arry1[$j].Split('-')[1])"
} | Set-Content $inputfile.FullName
}
$j++
} while ($j -le ($arry1.Length-1))
}
$objExcel.Quit()
脚本2:
function func3 {
param($arr3, $pat)
$arr3.GetEnumerator() | ?{$_.key -like $pat} | ForEach-Object {
$output=$_.value
return $output
}
}
$src = "C:\...xlsx"
$src1 = "C:\..."
$sheetName = "Sheet1"
$arr = @{};
$objExcel = New-Object -ComObject Excel.Application
$workbook = $objExcel.Workbooks.Open($src)
$sheet = $workbook.Worksheets.Item($sheetName)
$objExcel.Visible = $false
$rowMax = ($sheet.UsedRange.Rows).Count
$rowTC, $colTC = 1, 1
$rowCodeChange, $colCodeChange = 1, 2
for ($i=1; $i -le $rowMax-1; $i++) {
$TC = $sheet.Cells.Item($rowTC+$i, $colTC).Text
$CodeChg = [String]($sheet.Cells.Item($rowCodeChange+$i, $colCodeChange).Text)
if ($arr.ContainsKey($TC) -eq $false) {
$arr.Add($TC, $CodeChg)
}
}
$inputfiles = (Get-ChildItem -Path $src1 -Recurse)
foreach ($inputfile in $inputfiles) {
$pat1 = $inputfile.Name.SubString(8, 3)
$val = func3 $arr $pat1
$arry1 = $val -split ';'
Write-Host $arry1.Length
$j = 0
do {
#skipping these 3 items from getting replaced
if (($arry1[$j].Trim() -ne "S1") -and ($arry1[$j].Trim() -ne "S2") -and ($arry1[$j].Trim() -ne "S3")){
$content = [System.IO.File]::ReadAllText($inputfile.FullName).Replace($arry1[$j].Split('-')[0], $arry1[$j].Split('-')[1])
[System.IO.File]::WriteAllText($inputfile.FullName, $content)
Write-Host $arry1[$j].Split('-')[0]' replaced with '$arry1[$j].Split('-')[1]' in file: '$inputfile.FullName
}
$j++
} while ($j -le ($arry1.Length-1))
}
$objExcel.Quit()
文件所在的文件夹中的文件名称包含相同的数字,并且' TC'我的Excel工作表中的列。例如:
TC 086.txt TC 099.txt etc.
这样,在将Excel的内容导入哈希表后,我从文件名中提取数字,并在哈希表中获取相同键的相应值。例如,密钥' 086'的值。从散列表中可以得到AA-E1; A1-P2&#39 ;.然后我从哈希表值(由;
分隔)中拆分要替换的项目,然后将其存储在数组中。使用循环我尝试根据从电子表格中检索的数据替换每个文件的内容。
我对这两种方法面临的问题是每个文件中只有第一项被替换。其余的项目没有被替换。例如,只有' AA'文件中的值< TC 086.txt'正在被' E1'取代。 ' A1'没有被' P2'取代。
答案 0 :(得分:0)
我发现了问题所在。我基本上不得不修剪数组的元素
$arry1
分割后(用;分隔)并在将它们作为参数传递给'Replace'函数之前。显然,除了第一个元素之外,该数组中的每个元素之前都有一个空格(这就是它们存储在源代码中的方式:excel电子表格)。因此,“替换”方法没有在文件中找到该元素,因此没有替换它。在元素解决问题之前删除空格