如何使用Powershell中的参数替换文件中的模式

时间:2009-11-20 17:28:30

标签: 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")

正确创建了新文件,并且替换了%pattern%的所有实例,但是使用空字符串,而不是$ args [0]中的字符串。我遇到了$ args变量的范围问题?

1 个答案:

答案 0 :(得分:4)

是。 Foreach-Object的scriptblock获得了一个新的$ args,例如:

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")

顺便说一下,如果这是在脚本中,你可以通过使用这样的命名参数来完全避免这个问题:

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