2010-04-08 13 views
27

में हेरफेर करने के लिए मैं देख रहा हूं कि मैं होस्ट फ़ाइल में सामग्री को अद्यतन करने के लिए पावरहेल स्क्रिप्ट बना सकता हूं या नहीं।पावरहेल मेजबान फ़ाइल

किसी को भी पता है कि कोई उदाहरण हैं जो पावरहेल या किसी अन्य स्क्रिप्टिंग लैनागुएज का उपयोग कर मेजबान फ़ाइल में हेरफेर करते हैं?

धन्यवाद।

+0

बस फ़ाइल में संलग्न (इसे लिखना, आपके पास पर्याप्त अनुमतियां हैं) चाल चलनी चाहिए। – ChristopheD

उत्तर

26

सबसे पहले, यदि आप विस्टा या विंडोज 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 

यह देखते हुए मुझे लगता है कि आप कैसे के रूप में प्रविष्टियों में हेरफेर करने के लिए रेगुलर एक्सप्रेशन का उपयोग करने के देख सकते हैं ज़रूरी।

+0

विघटन बहुत अच्छा काम कर रहा है, लेकिन कंसोल में केवल [उचित] आउटपुट प्रिंट करने पर टिप्पणी करता है, मैं स्क्रिप्ट को व्यवस्थापक के रूप में चला रहा हूं, कुछ गुम है? – veritas

+0

@veritas मुझे संदेह है कि रेगेक्स पैटर्न के साथ कोई समस्या है। क्या यह कोई बेहतर '^ \ s * ([^ #]। +? \ D {1,3}। *? Localhost। *)' –

+0

मैंने पाया कि '$ होस्ट' चर वैरिएबल के बाद अपडेट नहीं हुआ 'और फ़ाइल के लिए foreach के बाद बस सभी आउटपुट पाइपलाइन: '$ मेजबान | foreach {...} | आउट-फाइल $ hostPath -enc ascii' और यह काम करता है। – veritas

2

मैंने मेजबान से प्रविष्टियों को हटाने के लिए एक कोड लिखा है। कोड से प्रविष्टियों को जोड़ने के लिए आप कोड को आसानी से बदल सकते हैं।

$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 
} 

अधिक जानकारी के लिए देख http://nisanthkv.blog.com/2012/06/13/remove-host-entries-using-powershell/

+0

आपको कोड डालने के लिए एचटीएमएल का उपयोग करने की आवश्यकता नहीं है, बस 4 रिक्त स्थान के साथ अपना कोड इंडेंट करें। – Dhara

17

Carbon module एक मेजबान प्रविष्टि की स्थापना के लिए एक Set-HostsEntry कार्य है: मेजबान फ़ाइल से निपटने में सबसे बड़ी दर्द मेरे लिए

Set-HostsEntry -IPAddress 10.2.3.4 -HostName 'myserver' -Description "myserver's IP address" 
0

याद है, जहां यह है। मैंने एक चर सेट किया है जो मेरी पावरशेल प्रोफ़ाइल में मेरी मेजबान फ़ाइल को इंगित करता है, जो टेक्स्ट एडिटर में संपादित करना आसान बनाता है।

PowerShell में, अपने प्रोफ़ाइल को खोलने के लिए निम्न लिखें:

C:\> Notepad $profile 

इस जोड़ें:

$hosts = "$env:windir\System32\drivers\etc\hosts" 

सहेजें फ़ाइल है, तो करीब है और फिर से खुला PowerShell, व्यवस्थापक के रूप में चल रहा है। आप बिना अनुमतियों के मेजबान फ़ाइल को संपादित नहीं कर सकते हैं।

अब आप अपने मेजबान उसी तरह आप अपने प्रोफ़ाइल संपादित करनी होगी फ़ाइल को संपादित कर सकते हैं:

C:\> Notepad $hosts 
17

किसी को भी एक और अधिक उन्नत उदाहरण के लिए लग रही है, तो मैं हमेशा इस सार का विशेष रूप से शौकीन किया गया है: 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 ("<ip> <host> # 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 <ip> <hostname>`n  hosts remove <hostname>`n  hosts show" 
} 
+0

में अस्थायी कोई फ़ाइल (लॉक) तक पहुंच नहीं है। ध्यान दें कि अगर मैं इसे दो बार चलाता हूं, तो अक्सर बार-बार मुक्त हो जाता है। पुनः प्रयास में फ़ाइल को सहेजने के लिए अच्छा हो सकता है। – sonjz

4

केविन रेमिसोस्की के उत्कृष्ट उत्तर से शुरू होने के बाद, मैं इसके साथ आया जो मुझे एक साथ कई प्रविष्टियों को जोड़ने/अपडेट करने देता है। मैंने किसी भी सफेद स्थान की तलाश करने के लिए विभाजन में रेगेक्स को भी बदल दिया, न केवल टैब।

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) 
+0

अच्छा;) मुझे इसके साथ खेलना होगा, हाल ही में सोचा था कि मैंने वैंप प्रकार के वातावरण का उपयोग नहीं किया है। खैर, वास्तव में मैं बस माइग्रेट किया। मेरे पास दोहरी बूट मशीन है, लेकिन यह है कि मैं विंडोज़ में अपनी दूसरी ज़रूरतों के कारण ज्यादातर समय फंस गया हूं, मैंने विंडोज़ (उबंटू के आधार पर) के लिए बैश स्थापित करने का फैसला किया और आदमी को गधे की स्थिति में बहुत कम दर्द यह एक विंडोज लोकल देव पर्यावरण से एक लिनक्स देव या लाइव संस्करण में माइग्रेट करने से संबंधित है। –