我正在查看是否可以创建powershell脚本来更新主机文件中的内容.
有人知道是否有任何使用PowerShell或任何其他脚本语言操作主机文件的示例?
谢谢.
首先,如果您使用的是Vista或Windows 7,请确保从提升的提示符运行这些命令:
# 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
鉴于此,我认为你可以看到如何使用正则表达式来操作条目.
该碳模块有一个设置,HostsEntry用于设置主机入口函数:
Set-HostsEntry -IPAddress 10.2.3.4 -HostName 'myserver' -Description "myserver's IP address"
如果有人正在寻找更高级的例子,我一直特别喜欢这个要点:https: //gist.github.com/markembling/173887
# # Powershell script for adding/removing/showing entries to the hosts file. # # Known limitations: # - does not handle entries with comments afterwards ("# comment") # $file = "C:\Windows\System32\drivers\etc\hosts" function add-host([string]$filename, [string]$ip, [string]$hostname) { remove-host $filename $hostname $ip + "`t`t" + $hostname | Out-File -encoding ASCII -append $filename } function remove-host([string]$filename, [string]$hostname) { $c = Get-Content $filename $newLines = @() foreach ($line in $c) { $bits = [regex]::Split($line, "\t+") if ($bits.count -eq 2) { if ($bits[1] -ne $hostname) { $newLines += $line } } else { $newLines += $line } } # Write file Clear-Content $filename foreach ($line in $newLines) { $line | Out-File -encoding ASCII -append $filename } } function print-hosts([string]$filename) { $c = Get-Content $filename foreach ($line in $c) { $bits = [regex]::Split($line, "\t+") if ($bits.count -eq 2) { Write-Host $bits[0] `t`t $bits[1] } } } try { if ($args[0] -eq "add") { if ($args.count -lt 3) { throw "Not enough arguments for add." } else { add-host $file $args[1] $args[2] } } elseif ($args[0] -eq "remove") { if ($args.count -lt 2) { throw "Not enough arguments for remove." } else { remove-host $file $args[1] } } elseif ($args[0] -eq "show") { print-hosts $file } else { throw "Invalid operation '" + $args[0] + "' - must be one of 'add', 'remove', 'show'." } } catch { Write-Host $error[0] Write-Host "`nUsage: hosts add `n hosts remove `n hosts show" }
从Kevin Remisoski上面的优秀答案开始,我想出了这个让我一次添加/更新多个条目.我还改变了分割中的正则表达式以寻找任何空白区域,而不仅仅是制表符.
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)
所有这些答案都非常详尽。这就是添加主机文件条目所需的全部:
Add-Content -Path C:\Windows\System32\drivers\etc\hosts -Value "127.0.0.1`tlocalhost" -Force
IP地址和主机名用`t分隔,t是制表符的Powershell表示法。