Powershell:相当于Perl的'for'命令?

时间:2012-11-13 02:34:44

标签: powershell for-loop replace

我在Perl中无数次使用过这种东西:

for ( $someVariable ) {
    s/findthis/replaceitwiththis/g;
    s/findthat/replaceitwithsomethingelse/g;
}

$someVariable的值暂时在$_,并且变量“就地”更新;每个新的替换命令继续更新/覆盖变量的内容。这是一个方便而紧凑的方法,可以在一个简单的循环中完成大量的更改。

Powershell是否具有“for”的相同用途?

在@neolisk的响应后添加评论,以便我可以使用格式化。

$s = 'abcde'
$s | foreach {
    $_ -replace 'a','x'
    $_ -replace 'e','z'
}
write-host "And: $s"

屏幕上显示的结果:

xbcde
abcdz
And: abcde

还尝试了$_ = $_ -replace 'a','x'等等。这里必须有一些额外的语法才能获得“就地”替换......

进一步修改@Nacht的回复 。这是有效的,虽然我对后面的嘀嗒声不是很疯狂:

$s = 'now is the time for all good individuals blah blah'
Write-Host $s
$s = $s `
  -replace "now", 'NEVER' `
  -replace 'time', 'moment' `
  -replace "blah\s+blah", '-- oh, WHATEVER'
Write-Host $s

输出:

now is the time for all good individuals blah blah
NEVER is the moment for all good individuals -- oh, WHATEVER

3 个答案:

答案 0 :(得分:3)

在Powershell中就是这样,但语法略有不同:

$someVariable | foreach {
    Write-Host $_;
}

如果您想进行就地替换,请记住$_是不可变的,即只读。正确的方法是在管道上输出新的字符串并收集到另一个变量中,因此对于您的示例,它可能如下所示:

$s = 'abcde' 
$newS = $s | foreach {
    $_ -replace 'a','x' -replace 'e','z'    
}
write-host "And: $newS";

答案 1 :(得分:0)

这就是你要找的东西吗?

$s = 'abcde'
$s = $s -replace 'a','x' -replace 'e','z'
write-host "And: $s"

输出:

And: xbcdz

您也可以在以下几行上执行此操作:

$s = 'abcde'
$s = $s -replace 'a','x'
$s = $s -replace 'e','z'
write-host "And: $s"

以下内容不起作用,因为每行都是单独输出的:

$s | foreach {
    $_ -replace 'a','x'
    $_ -replace 'e','z'
}

以下内容不起作用,因为赋值语句不输出任何内容:

$s | foreach {
    $_ = $_ -replace 'a','x'
}

答案 2 :(得分:0)

我不知道以这种方式回答我自己的问题是否合适。如果没有,请告知。总结几种方法(全部检查):

$s = 'abcde' (likewise for all below)
$s | foreach {
    $_ `
    -replace 'a', 'X' `
    -replace 'e', 'Z'
}

执行期间显示XbcdZ。 $ s 不变

$s = $s `
    -replace 'a', 'X' `
    -replace 'e', 'Z'

$ s“就地”更新;价值现在为XbcdZ

$t = $s | foreach {
    $_ `
    -replace 'a', 'X' `
    -replace 'e', 'Z'
}

$ s 不变。 $ t的价值:XbcdZ

$t = $s `
  -replace 'a', 'X' `
  -replace 'e', 'Z'

$ s不变。 $ t的值:XbcdZ

($t = $s) `
  -replace 'a', 'X' `
  -replace 'e', 'Z'
Write-Host "`$s: $s -- `$t: $t"

添加了parens以查看可能发生的情况。
两个变量的值都没有变化。 XbcdZ将打印到控制台上方通过Write-Host打印的行。