【问题标题】:Replace not working when Looping through an Array循环遍历数组时替换不起作用
【发布时间】:2019-02-18 08:12:54
【问题描述】:

正在处理一个项目,我需要用不同的前缀替换“path prefix”。自动复制文件,然后我将在本地使用这些文件。我认为与其制作新变量,不如重新利用复制完成后不需要的旧变量。循环遍历数组时遇到替换问题。我能够为这种特殊情况找到解决方案,但想了解为什么我的循环不起作用

没有显示任何错误来告诉我为什么它不工作。

任何帮助理解为什么循环时替换不起作用会有所帮助

我如何构建路径的示例代码

[string]$Root_Path = "\\Main_Blah_Path\"

[string]$Software = $Root_Path + "Software\"

[string]$Adobe_Reader = $Software + "Adobe_Reader\"
[string]$Firefox = $Software + "Firefox\"
[string]$Google_Chrome = $Software + "Google_Chrome\"

[System.Collections.ArrayList]$List_Of_Software = @(
    $Adobe_Reader
    $Firefox
    $Google_Chrome
)

我进行替换的方法示例。这些工作并将所需的输出写入控制台

foreach ($Path in $List_Of_Software) {
    $Path -replace '\\\\Main_Blah_Path\\','C:\Folder\'
}
$List_Of_Software | ForEach-Object {$_ -replace '\\\\Main_Blah_Path\\','C:\Folder\'}

我遇到的失败示例。我无法替换并将数据保存到自身中以进行替换。我根本无法让.replace 工作

foreach ($Path in $List_Of_Software) {
    $Path = $Path -replace '\\\\Main_Blah_Path\\','C:\Folder\'
}
$List_Of_Software | ForEach-Object {$_ = $_ -replace '\\\\Main_Blah_Path\\','C:\Folder\'}

foreach ($Path in $List_Of_Software) {
    $Path.Replace('\\\\Main_Blah_Path\\','C:\Folder\')
}

我在当前场景中使用的解决方案,但我可以预见到未来的一些事情,这种方法可能不是一个可行的选择

$List_Of_Software = $List_Of_Software -replace '\\\\Main_Blah_Path\\','C:\Folder\'

【问题讨论】:

    标签: arrays powershell loops replace


    【解决方案1】:

    您快到了,您只需在循环数组时将替换结果分配回变量即可。试试:

    $List_of_software = $List_Of_Software | 
      ForEach-Object {$_ -replace '\\\\Main_Blah_Path\\','C:\Folder\'}
    

    【讨论】:

    • 这是有效的。谢谢。不过我还有更多问题。我认为当您遍历一个数组时,它会选择对象/索引,您可以进行更改并将其保存回自身,因此,它将在数组中更新。还是我看错了?
    • 是的,但是使用 for 循环,而不是 foreach。这样您就可以修改每个数组元素。当您将数组发送到管道时,管道变量$_ 保存元素的副本(我假设),而不是它的实际值,也不是对它的引用。
    • foreach 不是 PS 中的for 循环吗?当我将数组通过管道传输到ForEach-Object 时,我可以使用$_,但结果没有改变。
    • 不,for 循环和 foreach 不是一回事。您不能通过管道连接到 for 循环。我之前的评论中解释了您无法在管道中更改 $_ 的原因。
    猜你喜欢
    • 2020-02-12
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多