2016-08-23 5 views
3

나는 다음과 같은 스크립트가에 -replace 및 Set-내용에 대한 파일 IO를 결합합니다. 그런 다음 동일한 파일을 사용하고 대체 파일을 다시 저장합니다. 그런 다음 한 번 더합니다.PowerShell을

이 방법은 효과가 있지만 비효율적입니다.

바꾸기를 한 번하고 파일을 한 번 저장하는 방법이 있습니까?

(가능하면, 내가 PowerShell을의 읽을 스타일을 유지하는 것을 선호합니다.)

+0

TheMadTechnician의 답변에 투표가 있습니다. 당신의 코드를 보았을 때 다른 것들 : 첫 줄은 어색하다 :'. /'는 리눅스를 '여기'로두고 있으므로, Get-ChildItem은 현재 경로 (그리고 현재의 PS 드라이브)를 지정하지 않으면 그것을 가정한다. . Where-Object에 출력을 파이핑하지만이 명령에서는 명령에 필터링 기능이 내장되어 있으므로 비효율적입니다. 또한, 사용했던 where-object 절로 괄호 안에 중괄호가 있습니다. 괄호는 불필요합니다. '$ allFiles = Get-ChildItem -recurse -Include "* .ts"'. Get-Content의 경우 $ file 객체 만 사용할 수 있습니다. 'Get-Content $ file' – Xalorous

답변

2

물론, 단지 ForEach-Object 블록 안에 당신을 대체 체인이 수행 할 수 있습니다

$allFiles = Get-ChildItem "./" -Recurse | Where { ($_.Extension -eq ".ts")} 
foreach($file in $allFiles) 
{ 
    (Get-Content $file.PSPath) | 
     Foreach-Object { 
      # Find and replace the dash cased the contents of the files 
      $_ -replace "my-project-name", '$appNameDashCased$' ` 
       -replace "MyProjectName", '$appNameCamelCased$' ` 
       -replace "myProjectName", '$appNamePascalCased$' 
     } | 
     Set-Content $file.PSPath  
} 
+0

@ Xalorous 나는 다음과 같지 않다. 당신이 의미하는 바를 확장 할 수 있겠습니까? 추가 파이프가 필요하다고 생각하지 않습니다. – briantist

+0

하나의 긴 명령 이었다는 내 의견이 삭제되었습니다. 그러나, 당신의 코드는 '-replace'라인의 끝에서 라인을 계속 유지하지 못합니다. 나는 당신이 첫번째 2의 끝에 backtick을 필요로한다라고 생각한다. – Xalorous

+0

@Xlorous true, fixed, 감사합니다. – briantist

3

을하고있다 실제로 당신이하고있는 것보다 훨씬 간단합니다. -Replace 명령을 다음과 같이 연결할 수 있습니다.

+0

니스! 나는'Set-Content'가 파이프 라인 때문에 이런 방식으로 실패 할 수 있다고 생각합니다. 따라서 괄호 안에'Get-Content'를 래핑하여 전체 파일을 먼저 읽도록 강요하지만, 이것도 쉽게 적용 할 수 있습니다. – briantist

+0

이 버전이 PowerShell 2.0과 호환되지 않는다고 생각합니다. – Vaccano

+0

PowerShell 4.0에서도이 문제가 발생했는데 그 중 하나가 작동하지 않습니다. 대체 할 내용을 모르는 것에 대해 불평했습니다. – Vaccano