2013-07-29 2 views
0

약 50 개의 파일에서 100 개가 넘는 자리 표시자를 약간 변경하도록 설계된 스크립트를 설정하려고합니다. 일반적으로 가능한 자리 표시 자 목록과 해당 값이 있습니다. exe.config 파일과 ini 파일이있는 일부 응용 프로그램이 있습니다. 이러한 응용 프로그램은 c : \ programfiles (x86) \ 및 d : \에 저장됩니다. 일반적으로 하나의 경로에서는 작동하지만 두 개에서는 작동하지 않습니다. 두 번 바꾸기 위해 코드를 쉽게 작성할 수는 있지만 많은 코드가 복잡해져 다른 사람들이 읽을 수 없게됩니다.Powershell - 폴더를 여러 위치에 나열하고 해당 위치의 파일을 변경합니다.

ls c:\programfiles(x86) -Recurse | where-object {$_.Extension -eq ".config" -or $_.Extension -eq ".ini"} | %{(gc $PSPath) | %{ 
$_ -replace "abc", "qwe" ` 
-replace "lkj", "hgs" ` 
-replace "hfd", "fgd" 
} | sc $_PSPath; Write-Host "Processed: " + $_.Fullname} 

나는에 실행 명령 = 경로 2, C $ = $ A + $ B하고는 LS를 받고으로까지 작동하는 것 같다 b를 $ A = 경로 1, $ 넣어 두 경로를 포함하도록 시도했다 두 개의 다른 장소. 그러나 파일이있는 경로를 저장하는 것처럼 보이지 않으므로 현재 스크립트를 실행중인 폴더에서 찾은 파일 이름을 바꾸려고 시도합니다. 따라서 파일이 있어야하는 위치에있을지라도 다른 위치에 있지는 않습니다 ...

그래서 .. 어떻게 Powershell을 통해 2 곳의 다른 위치에 파일을 나열 할 수 있는지 생각해보십시오. 코드를 두 번 가지지 않고도 두 곳에서 동일한 변수를 대체 할 수 있습니까? 변수에 두 번 사용해야 할 코드를 두 번 쓰는 대신에 다시 작성해야한다고 생각했지만 코드를 사용하기 전에 코드를 해결 한 것처럼 보였습니다. 데이터는 첫 번째 부분에서옵니다.

답변

1

멋진 파이프 라인이 있다면 모든 문제는 ... 음 ... 유체입니까? 사물? 나는 단서가 없다. 어쨌든, 단지 (길을 따라 몇 가지 문제 및 해결) 또 다른 레이어를 추가 :

$places = 'C:\Program Files (x86)', 'D:\some other location' 
$places | 
    Get-ChildItem -Recurse -Include *.ini,*.config | 
    ForEach-Object { 
    (Get-Content $_) -replace 'abc', 'qwe' ` 
        -replace 'lkj', 'hgs' ` 
        -replace 'hfd', 'fgd' | 
     Set-Content $_ 
    'Processed: {0}' -f $_.FullName 
    } 

주목할만한 변화 :

  • 은 단지 첫 단계로 크롤링 폴더 목록을 반복.
  • Get-ChildItem에서 직접 필터링하면 Where-Object이 더 빨리 저장됩니다.
  • -replace은 배열에 직접 적용 할 수 있으므로 다른 ForEach-Object은 필요하지 않습니다.

대체 수가 많으면 해시 테이블을 사용하여 저장하면 -replace 'foo', 'bar'의 20 줄이 없어야합니다.

+0

감사합니다. 수요일 제안을 시도해보십시오. 나는 조금만 시작해서 좀 더 확장했습니다. 나는 당신이 얼마나 힘들게 추가 할 수 있는지에 대해 반대 할 것이 없다면 더 나아지는 것이 사실이라고 생각합니다. 나중에 코드를 공부하게 될 것입니다. 대체 수는 약 112입니다. 해시 테이블에서도 읽어야합니다. 일반적으로 약 50 개의 파일과 112 개의 대체 파일이있을 것이며 모든 파일에 포함되는 것은 아닙니다. 잠재력은 50x112이므로 빨리 지키면됩니다. 필자는 각 파일을 대체 할 코드를 작성하기 시작했습니다. 이제는 112 개의 대체 파일 중 하나입니다. – SkyRaider

+0

좋아 :) 트릭을 했어. 모든 것이 마치 내가 원했던 것처럼 효과가있었습니다. 또한 더 많은 위치를 추가하고자 할 경우 더 쉽게 만들 수 있습니다. – SkyRaider

관련 문제