我有一个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变量的范围问题?
答案 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")