标题: [问题求助] 使用powershell 修改host文件 [打印本页]
作者: 5i365 时间: 2022-2-27 20:02 标题: 使用powershell 修改host文件
以前一直使用cmd批处理修改host文件, 刚刚在一段ps代码中添加修改host的代码, 就搜索了一下资源, 找到如下代码, 但是测试了一下, 不稳, 问题如下, 请高手指点, 感谢!
问题1. -enc ascii 这个参数居然会把原文件编码格式改为UTF8, 真是怪了
问题2.在已经有记录的情况下,仍然会追加记录
问题3.追加完后,用notepad2打开文件,提示换行符不一致- $IP_URL = "127.0.0.1 www.bing.com"
-
- if ((Get-Content $env:windir\System32\drivers\etc\hosts | ?{ $_ -match "/s$IP_URL" }) -eq $null)
- {
- "`n$IP_URL" | Out-File "$env:windir\System32\drivers\etc\hosts" -Append -enc ascii
- echo "已添加!"
- }
- else
- {
- echo "已存在"
- }
复制代码
作者: idwma 时间: 2022-2-27 20:21
- $IP_URL = "127.0.0.1 www.bing.com"
-
- if ((Get-Content $env:windir\System32\drivers\etc\hosts | ?{ $_ -match "$($IP_URL -replace '\s+','\s+')" }) -eq $null)
- {
- "$IP_URL" | ac "$env:windir\System32\drivers\etc\hosts"
- echo "已添加!"
- }
- else
- {
- echo "已存在"
- }
复制代码
作者: 5i365 时间: 2022-2-27 20:50
回复 2# idwma
感谢大侠帮忙, 现在可以了, 请教下面代码中把空格替换成空格什么意思?
$IP_URL -replace '\s+','\s+'
作者: idwma 时间: 2022-2-27 21:17
回复 3# 5i365
你看这两个是一样的吗?- $IP_URL = "127.0.0.1 www.bing.com"
- $IP_URL11 = "127.0.0.1 www.bing.com"
- $IP_URL -match $IP_URL11
- $IP_URL -match "$($IP_URL11 -replace '\s+','\s+')"
复制代码
作者: 5i365 时间: 2022-2-27 21:22
回复 4# idwma
感谢指点, 是不一样, 我其实不明白的是, 为什么要替换的和替换为的 是一样的正则表达, 按我的理解应该替换为'\s{1}'或'\s'
$IP_URL -match "$($IP_URL11 -replace '\s+','\s{1}')"
作者: idwma 时间: 2022-2-27 21:53
回复 5# 5i365
试试第一行多加几个空格前后增加中间穿插若干个空格
是不是感觉这个替换多于了,不加也可以的
作者: 5i365 时间: 2022-2-28 10:26
回复 6# idwma
感谢指点, 确实感觉多余了, 不加怎么可以? 我试了不行, 返回false
作者: 5i365 时间: 2022-2-28 10:28
回复 6# idwma
大侠, 如果是一次添加多行条目, 应该怎么改, 例如:
$IP_URL = @(
"127.0.0.1 www.bing.com"
"127.0.0.1 www.sina.com"
)
作者: idwma 时间: 2022-2-28 13:56
- $IP_URL = @(
- "127.0.0.1 www.bing.com"
- "127.0.0.1 www.sina.com"
- )
-
- $IP_URL -notmatch "$((Get-Content $env:windir\System32\drivers\etc\hosts | ?{ $_ -match "$($IP_URL -join '|')"}) -join '|')"|ac "$env:windir\System32\drivers\etc\hosts"
复制代码
作者: 5i365 时间: 2022-2-28 16:49
回复 9# idwma
刚试了下, 没有生效
作者: 5i365 时间: 2022-2-28 17:36
回复 9# idwma
老外的代码参考:- # Uncomment lines with localhost on them:
- $hostsPath = "$env:windir\System32\drivers\etc\hosts"
- $hosts = get-content $hostsPath
- $hosts = $hosts | Foreach {if ($_ -match '^\s*#\s*(.*?\d{1,3}.*?localhost.*)')
- {$matches[1]} else {$_}}
- $hosts | Out-File $hostsPath -enc ascii
-
- # Comment lines with localhost on them:
- $hosts = get-content $hostsPath
- $hosts | Foreach {if ($_ -match '^\s*([^#].*?\d{1,3}.*?localhost.*)')
- {"# " + $matches[1]} else {$_}} |
- Out-File $hostsPath -enc ascii
复制代码
------------------------------------------------------------------------------------------------ function setHostEntries([hashtable] $entries) {
- $hostsFile = "$env:windir\System32\drivers\etc\hosts"
- $newLines = @()
-
- $c = Get-Content -Path $hostsFile
- foreach ($line in $c) {
- $bits = [regex]::Split($line, "\s+")
- if ($bits.count -eq 2) {
- $match = $NULL
- ForEach($entry in $entries.GetEnumerator()) {
- if($bits[1] -eq $entry.Key) {
- $newLines += ($entry.Value + ' ' + $entry.Key)
- Write-Host Replacing HOSTS entry for $entry.Key
- $match = $entry.Key
- break
- }
- }
- if($match -eq $NULL) {
- $newLines += $line
- } else {
- $entries.Remove($match)
- }
- } else {
- $newLines += $line
- }
- }
-
- foreach($entry in $entries.GetEnumerator()) {
- Write-Host Adding HOSTS entry for $entry.Key
- $newLines += $entry.Value + ' ' + $entry.Key
- }
-
- Write-Host Saving $hostsFile
- Clear-Content $hostsFile
- foreach ($line in $newLines) {
- $line | Out-File -encoding ASCII -append $hostsFile
- }
- }
-
- $entries = @{
- 'aaa.foo.local' = "127.0.0.1"
- 'bbb.foo.local' = "127.0.0.1"
- 'ccc.foo.local' = "127.0.0.1"
- };
- setHostEntries($entries)
复制代码
--------------------------------------------------------------- $domainName = "www.abc.com"
- $rplaceStr = ""
- $rHost = "C:\Windows\System32\drivers\etc\hosts"
- $items = Get-Content $rHost | Select-String $domainName
- Write-host $items
- foreach( $item in $items)
- {
- (Get-Content $rHost) -replace $item, $rplaceStr| Set-Content $rHost
- }
复制代码
作者: 5i365 时间: 2022-2-28 18:02
本帖最后由 5i365 于 2022-2-28 18:22 编辑
回复 9# idwma
自己想了个办法, 但是如果host最后一行不是空行, 则第一行网址会跑到前一行的后面
测试了一下, add-content 确实有这个问题, 文件中最后一行没有空行, 就追加到最后一行的末尾了- $Hosts = "$env:windir\System32\drivers\etc\hosts"
-
- $urls = @(
- "www.baidu.com"
- "www.bing.com"
- ) |
- foreach{
- if ((gc $Hosts | Select-String $_) -eq $null)
- {
- ac $hosts "127.0.0.1 $_"
- }
- }
复制代码
作者: idwma 时间: 2022-2-28 18:24
- $IP_URL = @(
- "127.0.0.1 www.bing.com"
- "127.0.0.1 www.sina.com"
- )
- $a=(Get-Content "$env:windir\System32\drivers\etc\hosts" | ?{ $_ -match "$($IP_URL -join '|')"}) -join '|'
- if ($a -eq '')
- {
- $IP_URL | ac "$env:windir\System32\drivers\etc\hosts"
- echo "已添加!"
- }
- else
- {
- $IP_URL -notmatch "$a" | ac "$env:windir\System32\drivers\etc\hosts"
- echo "已存在"
- }
复制代码
作者: 5i365 时间: 2022-2-28 18:29
回复 13# idwma
大侠, 使用ac和out-file都有这个问题, 最后一行没有空行, 就会追加到最后一行的末尾
作者: idwma 时间: 2022-2-28 18:57
回复 14# 5i365 - $Hosts = "$env:windir\System32\drivers\etc\hosts"
- $a=gc $Hosts
- $urls = @(
- "www.baidu.com"
- "www.bing.com"
- ) |
- foreach{
- if($a[-1] -ne ''){ac $hosts ''}elseif ((gc $Hosts | Select-String $_) -eq $null)
- {
- ac $hosts "127.0.0.1 $_"
- }
- }
复制代码
作者: 5i365 时间: 2022-2-28 19:01
回复 15# idwma
还是不行, 多了两个空行
作者: 5i365 时间: 2022-2-28 19:25
回复 15# idwma
搞定了, 把if移到上面去就行了- $Hosts = "$env:windir\System32\drivers\etc\hosts"
- $a = gc $Hosts
- if ($a[-1] -ne '') { ac $hosts '' }
- $urls = @(
- "www.baidu.com"
- "www.bing.com"
- ) |
- foreach{
- if ((gc $Hosts | Select-String $_) -eq $null)
- {
- ac $hosts "127.0.0.1 $_"
- }
- }
复制代码
作者: 5i365 时间: 2022-2-28 20:15
本帖最后由 5i365 于 2022-2-28 20:19 编辑
回复 15# idwma
分享老外写的, 用PS对话框的形式来改HOST, 里面有控件的位置, 尺寸之类的, 感觉应该可以去掉, 应该可以精简, 以前看到过有类似的, 才几行代码就行!- Add-Type -AssemblyName System.Windows.Forms
- Add-Type -AssemblyName System.Drawing
-
- $hostsfilelocation = "$env:windir\System32\drivers\etc\hosts"
- $readhostsfile = Get-Content $hostsfilelocation
-
- $form = New-Object System.Windows.Forms.Form
- $form.Text = 'Update HOSTS File'
- $form.Size = New-Object System.Drawing.Size(300, 200)
- $form.StartPosition = 'CenterScreen'
-
- $AddHosts = New-Object System.Windows.Forms.Button
- $AddHosts.Location = New-Object System.Drawing.Point(55, 120)
- $AddHosts.Size = New-Object System.Drawing.Size(90, 25)
- $AddHosts.Text = 'Add Record'
- $AddHosts.DialogResult = [System.Windows.Forms.DialogResult]::OK
- $form.AcceptButton = $AddHosts
- $form.Controls.Add($AddHosts)
-
- $CancelButton = New-Object System.Windows.Forms.Button
- $CancelButton.Location = New-Object System.Drawing.Point(170, 120)
- $CancelButton.Size = New-Object System.Drawing.Size(75, 25)
- $CancelButton.Text = 'Cancel'
- $CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
- $form.CancelButton = $CancelButton
- $form.Controls.Add($CancelButton)
-
- $Hostslabel = New-Object System.Windows.Forms.Label
- $Hostslabel.Location = New-Object System.Drawing.Point(10, 20)
- $Hostslabel.Size = New-Object System.Drawing.Size(280, 20)
- $Hostslabel.Text = 'Enter New HOSTNAME/FQDN:'
- $form.Controls.Add($Hostslabel)
-
- $HoststextBox = New-Object System.Windows.Forms.TextBox
- $HoststextBox.Location = New-Object System.Drawing.Point(10, 40)
- $HoststextBox.Size = New-Object System.Drawing.Size(260, 20)
- $form.Controls.Add($HoststextBox)
-
- $IPlabel = New-Object System.Windows.Forms.Label
- $IPlabel.Location = New-Object System.Drawing.Point(10, 60)
- $IPlabel.Size = New-Object System.Drawing.Size(280, 20)
- $IPlabel.Text = 'Enter IP:'
- $form.Controls.Add($IPlabel)
-
- $IPtextBox = New-Object System.Windows.Forms.TextBox
- $IPtextBox.Location = New-Object System.Drawing.Point(10, 80)
- $IPtextBox.Size = New-Object System.Drawing.Size(260, 20)
- $form.Controls.Add($IPtextBox)
-
- $form.Topmost = $true
-
- $form.Add_Shown({ ($HoststextBox, $IPtextbox).Select() })
-
- $result = $form.ShowDialog()
-
- if ($result -eq [System.Windows.Forms.DialogResult]::OK)
- {
- $inputhosts = $HoststextBox.Text
- $inputip = $IPtextBox.Text
- $newrecord = "$inputip $inputhosts"
- Add-Content -Path $hostsfilelocation -Value $newrecord
- }
复制代码
作者: idwma 时间: 2022-2-28 20:26
这么绕的吗,直接用记事本打开不好吗
作者: 5i365 时间: 2022-3-1 07:52
回复 19# idwma
嗯, 偶尔改手动更方便些, 改多台电脑时, 用批处理改不用到电脑旁边, 不用远程就改, 非常方便
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |