none
powershell修改hosts脚本求助 RRS feed

  • 问题

  • 在一个操作里 需要修改并复原hosts文件,添加多行 后根据特征注释特征行  即在已contoso.com行首插入#,脚本如下:

    #追加行

    $strs=@"

    contoso.com 192.168.100.1 
    contoso.com 192.168.100.100 
    "@
    $hosts="C:\Windows\System32\drivers\etc\hosts"
    Add-Content  -LiteralPath $hosts -Value $strs  -Force -Encoding Ascii

    #注释特征行,行首插入#

    Get-Content $hosts | foreach {
    if ($_.StartsWith("contoso.com")) {
    $_=$_.Insert(0,"#") 
    }
    $Content=$_
    }

    $Content | | Out-File $hosts -Force

    其中#注释特征行 根据这个思路,行插入或者替换 我写不出直接覆盖hosts文件,希望指导一下,或者给点其他的思路  就是关于文本的多行操作方面的,谢谢了


    • 已编辑 badacook 2019年11月13日 10:59
    2019年11月13日 9:04

答案

  • 已经发现 可以用正则 完成 特征行的注释

    (gc "C:\Windows\System32\drivers\etc\hosts") -replace "^contoso.com","#contoso.com" | Set-Content "C:\Windows\System32\drivers\etc\hosts" -Force

    而采取上面循环的方式 ,需要提前将 $Content 定义为空数组,脚本如下

    $hosts="C:\Windows\System32\drivers\etc\hosts"
    $Content=@()
    Get-Content $hosts | foreach {
    if ($_.StartsWith("contoso.com")) {
    $_=$_.Insert(0,"#") 
    }
    $Content+=$_
    }
    $Content | Set-Content  $hosts -Force

    • 已标记为答案 badacook 2019年11月14日 0:26
    2019年11月14日 0:26

全部回复

  • 发现 foreach 循环内部和外部  $Content 不同 如何使 $Content 在外部值 一致,而不是字符串数组的最后一行
    2019年11月13日 11:13
  • 已经发现 可以用正则 完成 特征行的注释

    (gc "C:\Windows\System32\drivers\etc\hosts") -replace "^contoso.com","#contoso.com" | Set-Content "C:\Windows\System32\drivers\etc\hosts" -Force

    而采取上面循环的方式 ,需要提前将 $Content 定义为空数组,脚本如下

    $hosts="C:\Windows\System32\drivers\etc\hosts"
    $Content=@()
    Get-Content $hosts | foreach {
    if ($_.StartsWith("contoso.com")) {
    $_=$_.Insert(0,"#") 
    }
    $Content+=$_
    }
    $Content | Set-Content  $hosts -Force

    • 已标记为答案 badacook 2019年11月14日 0:26
    2019年11月14日 0:26