Foreach循环内写入输出失败-Powershell

Foreach循环内写入输出失败-Powershell,powershell,Powershell,我是Powershell的新手,我想知道为什么这个函数不能按我想要的方式工作。以下函数取消对指定计算机的主机文件中的行的注释。它工作得很好!但是我希望能够使用写输出将每一行输出到屏幕,并获取变量并将其存储在另一个数组中。这个写输出没有任何作用,我无法将它添加到数组中。为什么?上面的写输出工作正常 function UnCommentHostsFile($ip){ Write-Output "This Write-Output Works!" $hosts = $hosts | F

我是Powershell的新手,我想知道为什么这个函数不能按我想要的方式工作。以下函数取消对指定计算机的主机文件中的行的注释。它工作得很好!但是我希望能够使用写输出将每一行输出到屏幕,并获取变量并将其存储在另一个数组中。这个写输出没有任何作用,我无法将它添加到数组中。为什么?上面的写输出工作正常

function UnCommentHostsFile($ip){

   Write-Output "This Write-Output Works!"

   $hosts = $hosts | Foreach {

       #This part of the function works great!
       if ($_ -match $regex + $ip){
           $_.replace("#", "")

           #This is where I want to add it to an array and write-output but I can't.
       } 
       else {
           $_
       }

       #This does not output!
       Write-Output $_
   }
}

任何帮助都将不胜感激!谢谢!:)

您实际上并不需要写入输出。将其保留为对象,您可以在函数外部以任何方式格式化该对象。我对它进行了更新,以便在每一行中,如果它与您的正则表达式匹配,它都会像您已经拥有的那样,将#替换为零,但我删除了Else子句,因为它没有意义。我将
$.replace(“#“,”)
更改为
$\u=$.replace(“#“,”)
,这样它实际上更新了$Hosts中的行,而不仅仅是回显它。然后,当所有操作都完成后,它将输出整个$hosts更新行和所有

function UnCommentHostsFile($ip){

   $hosts = $hosts | Foreach {

       #This part of the function works great!
       if ($_ -match $regex + $ip){
           $_ = $_.replace("#", "")

           #This is where I want to add it to an array and write-output but I can't.
       } 

       #This does not output!
   }
   $Hosts
}

编辑:当您调用函数时,它应该吐回$Hosts中的任何内容,因此它应该输出到屏幕。不需要写输出或任何东西。它将在屏幕上为用户显示,除非您将输出重定向到某个位置,在这种情况下,只需在将其打印到屏幕的管道中添加一点即可。

要回答您的问题,请执行以下操作:

$hosts = $hosts | Foreach {...}
foreach
脚本块中输出到管道的所有内容都将被重新定向到变量
$hosts

Write Output
写入到管道中,并且您正在该脚本块中执行该操作


如果要显式写入屏幕,请使用
write Host
,或
write Verbose

这不起作用。我试着将写主机、写输出和写详细信息放在一起。没有任何内容输出到屏幕,但仍在正确写入文件。无任何内容。在这三种情况中,任何一种都不会写入屏幕。如果我把Write语句放在If语句中,它就不会运行。如果我把写主机放在这里,我的原始写输出是,它会打印出文件中的每一行。我只想要已更改的行。您确定其中任何行符合If条件吗?是的,导致文件更改。每次我运行它,它都会在hosts.file中注释出大约10行。下次我运行它时,我会切换它,它会注释出一组不同的IP。这很奇怪,真的很奇怪。使用测试数据运行该脚本时,如果我设置$VerbosePreference继续,我会将其写入控制台。我需要将其写入屏幕,一些非技术人员将使用该脚本,并将其保存到数组中,以便对特定条目运行操作。$\。replace(“#“,”)工作得很好,您的代码也工作得很好。