【问题标题】:Adding/Removing hosts file entry using powershell corrupts the file使用 powershell 添加/删除主机文件条目会损坏文件
【发布时间】:2019-06-23 14:24:09
【问题描述】:

我正在尝试使用 powershell 在 Windows 主机文件中添加或删除特定条目,但是当我这样做时,它会工作一段时间,然后会再次被编辑(当 Windows 读取它时,我猜) ,并且它变得损坏(显示中文字符)。

我已经尝试使用我找到的部分代码 here。 它允许我正确编辑文件并且条目是有效的,直到它被损坏。

我这样做是为了添加条目:

If ((Get-Content "$($env:windir)\system32\Drivers\etc\hosts" ) -notcontains "111.111.111.111 example.com")  
 {ac -Encoding UTF8  "$($env:windir)\system32\Drivers\etc\hosts" "111.111.111.111 example.com" }

Here 是文件损坏后的样子:

感谢您的帮助。

已解决: 删除-Encoding UTF8

【问题讨论】:

  • 为什么要更改文件追加的编码?
  • 该文件通常是 ASCII。与 AdminOfThings 一样,我很好奇您为什么要更改编码...
  • 老实说,我从上面的示例中复制了它,我会尝试将其删除,还是应该指定其他编码?
  • *-Content cmdlet 默认为 ASCII 编码,因此只需删除参数即可。
  • @AnsgarWiechers *-content 默认以 ANSI 编码,可以处理重音等内容。

标签: windows powershell hosts


【解决方案1】:

因为正如它在 hosts 文件的注释中所说,“IP 地址和主机名应至少用一个空格分隔。”,试图找到一个只有一个空格的字符串中间的字符可能返回 false。

我认为最好使用正则表达式,因为它允许匹配多个空格字符以将 IP 与主机名分开。 但是,这确实需要在条目的两个部分都使用[Regex]::Escape(),因为它们包含正则表达式特殊字符(点)。

类似这样的:

$hostsFile  = "$($env:windir)\system32\Drivers\etc\hosts"
$hostsEntry = '111.111.111.111 example.com'

# split the entry into separate variables
$ipAddress, $hostName = $hostsEntry -split '\s+',2
# prepare the regex
$re = '(?m)^{0}[ ]+{1}' -f [Regex]::Escape($ipAddress), [Regex]::Escape($hostName)

If ((Get-Content $hostsFile -Raw) -notmatch $re) {
    Add-Content -Path $hostsFile -Value $hostsEntry
}

【讨论】:

  • 是的,确实如此,为了匹配所有的可能性,这样做会更好,但我在这里的目标是不要添加两次条目,以防这个脚本被多次调用,所以在这种情况下 -notcontains 就足够了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-26
  • 1970-01-01
  • 2018-06-13
  • 2018-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多