>

iini 파일이 있습니다 :

number=1
problem=4
issue=2
test=7
number=2
problem=5
issue=3
test=8

중복 키는 있지만 값이 다릅니다.

powershell을 사용하여 두 배로 된 키를 모두 삭제하려면 어떻게합니까?

최종 ini 파일은 다음과 같아야합니다 :

number=1
problem=4
issue=2
test=7

감사합니다!

업데이트 : 2018 년 10 월 10 일 (공휴일에 죄송합니다)

드디어 만들었습니다! @Richard Siddaway 덕분에 완벽하게 작동합니다. 감사합니다. 감사합니다.

@ 그렇습니다. 내 [섹션]을 놓 쳤고 ini 파일을 읽을 수있는 두 번째 프로그램을위한 추가 부분과 부분을 추가했습니다

이것은 제 코드입니다 :

#merge two files
$files = Get-ChildItem "D:\all"
foreach ($file in $files) {
$name = dir $file.FullName | select -ExpandProperty Name
$ReferenceObject = Get-Content D:\File.ini
$DifferenceObject = Get-Content $file.FullName
Compare-Object -ReferenceObject $ReferenceObject -DifferenceObject $DifferenceObject -PassThru | Out-File ('D:\output\' + $name)
# filter Date an Number
$fileContent = Get-Content ('D:\output\' + $name)
# iterate over lines
foreach($line in $fileContent) {
    #add "=" to [section]
    if($line.StartsWith('[')) {
    $newline = ($line + '=')
    $newline | Add-Content ('D:\output2\' + $name)
    }
  # filter lines beginning with 'Date, ...'
    elseif((-not $line.StartsWith('Date')) -and (-not $line.StartsWith('Number')) -and (-not $line.StartsWith('Date2'))) {
    # output lines to new file
    $line | Add-Content ('D:\output2\' + $name)
  }
}
#remove duplicates
$fileContent = Get-Content ('D:\output2\' + $name)
$unqkeys = [ordered]@{}
foreach ($line in $fileContent){
    if ($line -ne '') {
    $a = $line -split '='
    if (-not $unqkeys[$($a[0].Trim())]){
      $unqkeys += @{$a[0].Trim() = $a[1].Trim()}
    }
  }
}
$unqkeys.GetEnumerator() | 
foreach {
   Out-File -FilePath ('D:\output3\' + $name) -InputObject "$($_.key)=$($_.value)" -Append 
}

# add file location to [section]
$fileContent = Get-Content ('D:\output3\' + $name)
foreach($line in $fileContent) {
  # filter for section
  if($line.StartsWith('[')) {
    # output lines to new file 
    $newline = $line -replace "[[]", "|" -replace "]=", "]"
    $linemodif = ("[C:\mypath\File.ini" + $newline)
    $linemodif | Add-Content ('D:\output4\' + $name)
  }else {
    $line | Add-Content ('D:\output4\' + $name)
  }
}
}
#Move ouput to solution
Get-ChildItem -Path "D:\output4\*.*" -Recurse | Move-Item -Destination "D:\solution" -force
#delete every single output
Remove-Item -Path D:\output\*.*
Remove-Item -Path D:\output2\*.*
Remove-Item -Path D:\output3\*.*
Remove-Item -Path D:\output4\*.*

이것은 병합 후 내 ini 파일이었습니다.

[SECTION1]
Tester=5
Magnet=2
Number=3459353484
Date=01/01/2018 11:00:00
Problem=
Issue=
[SECTION2]
Progress=0
Tester=4
Magnet=1
Number=0
Date=01/01/1999

이것은 내 결과입니다 :

[C:\mypath\File.ini|SECTION1]
Tester=5
Magnet=2
Problem=
Issue=
[C:\mypath\File.ini|SECTION2]
Progress=0

@Paxz가 말했듯이 여전히 누군가가 "임의의 일부 스 니펫을 붙여 넣은"것처럼 보입니다. 나는 그것이 의미하는 바를 수행하기 때문에 완성되고 완전히 만족하지만, 내 스크립트가 그리 깨끗하지도 않고 좋은 해결책도 아니라는 것을 잘 알고 있습니다. 특히 내 출력의 경우 :/누군가 다음에 개선 할 힌트가 있습니까? 어쩌면 모든 출력을 변수에 담을 수 있습니까? 그리고 Richards 스크립트를 사용할 수 있도록 섹션에 '='를 추가했습니다 ...


  • 답변 # 1

    이것을 시도해보십시오

    if (Test-Path -Path c:\test\new.ini) {
      Remove-Item -Path c:\test\new.ini
    }
    $unqkeys = [ordered]@{}
    
    $lines = Get-Content -Path C:\test\t1.ini 
    foreach ($line in $lines){
      if ($line -ne '') {
        $a = $line -split '='
        if (-not $unqkeys[$($a[0].Trim())]){
          $unqkeys += @{$a[0].Trim() = $a[1].Trim()}
        }
      }
    }
    $unqkeys.GetEnumerator() | 
    foreach {
       Out-File -FilePath C:\test\new.ini -InputObject "$($_.key)=$($_.value)" -Append 
    }
    
    Get-Content -Path C:\test\new.ini
    
    

    파일에서 처음 발견 된 고유 키를 보유하기 위해 정렬 된 해시 테이블을 사용하고 있습니다. 마지막에 데이터를 새 파일에 다시 씁니다. 필요에 맞게이를 수정할 수 있어야합니다

  • 이전 mainframe - 코볼을 사용하여 두 날짜 사이의 데이터 확인
  • 다음 python - 클래스 내 콜백 메소드에서 메소드를 올바르게 호출하려면 어떻게해야합니까?