2009-11-20 5 views
2

파일에있는 패턴을 스크립트에 전달 된 인수로 대체하는 powershell 스크립트가 있습니다. 알고리즘을 다른 사이트에서 가져 와서 위대한 일을하지만, 리터럴 문자열을 사용하면 패턴이 대체되지 않는다는 사실을 제외하고는 훌륭하게 작동합니다.Powershell에서 파일의 패턴을 인수로 대체하는 방법

여기에 원래 스크립트입니다 :

(Get-Content c:\File.txt) | 
    Foreach-Object { $_ -replace "\*", "@" } | 
    Set-Content c:\File.txt 

여기 (기본적으로) 내 버전의

(Get-Content ("c:\File-" + $args[0] + ".txt")) | 
    Foreach-Object { $_ -replace "\%pattern\%", $args[0] } | 
    Set-Content ("c:\File-" + $args[0] + ".txt") 

새로운 파일이 제대로 생성되고 % 패턴 %의 모든 인스턴스를 교체하고 있지만 빈과 string, $ args [0]의 문자열이 아닙니다. $ args 변수의 범위 지정 문제가 발생했습니다.

답변

4

예.

PS> function foo { $OFS=',';"func: $args"; 1 | Foreach {"foreach: $args"} } 
PS> foo 1 2 3 
func: 1,2,3 
foreach: 

이 쉽게 임시 변수로 해결 :이 스크립트에있는 경우

$fargs = $args; 
(Get-Content ("c:\File-" + $args[0] + ".txt")) | 
    Foreach-Object { $_ -replace "\%pattern\%", $fargs[0] } |  
    Set-Content ("c:\File-" + $args[0] + ".txt") 

BTW, 당신은에 의해이 문제를 완전히 피할 수의 Foreach-객체의 스크립트 블록은 새로운 $의 인수가 예 얻는다 다음과 같은 명명 된 매개 변수를 사용하십시오 :

param([string]$Pattern) 
(Get-Content ("c:\File-$Pattern.txt")) | 
    Foreach-Object { $_ -replace "\%pattern\%", $Pattern } |  
    Set-Content ("c:\File-$Pattern.txt") 
+0

그냥 호기심에서 벗어남 : 모든 스크립트 블록 또는 'ForEach-Object'의 경우에 해당합니까? 후자라면 '$ args'에 실제로 무엇이 있습니까? – Joey

+0

AFAIK 모든 scripblock은 새로운 $ args를 얻습니다. OP는이 코드가 스크립트에 있으므로 $ args에 질문을 요구하는 이름이없는 매개 변수가 포함될 것이고 이름이 지정된 매개 변수를 사용하지 않는 것이 좋습니다. $ args 대신 $ Pattern. 그것이 내가 취할 접근법입니다. 나는이 제안을 답에 붙일 것이라고 생각한다. –

+0

오, 좋은. 저는 실제로 스크립트 블록에 인수를 전달할 수 있습니다. '. {Write-Host $ args} 1,2,3'이 실제로 작동합니다. 나는 약간의 나의 Golfed Project Euler 솔루션을 약간 줄일 수 있다고 생각한다 :-) – Joey

관련 문제