Recently, I need to modify the hosts during automation testing for windows app.
Just find out powershell is a great shell for doing stuffs in windows 10 ( powershell is pre-installed since windows 8)
- What is hosts file: Hosts file is a file that maps hostnames to IP addresses. For example
# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhost
Without # that will be activatted
is for comment the line
To modify the hosts file, you will need to open the file as administrator
- Scenario
For example we need to modify the hosts file as below
#10.3.4.53 browser.beebee.com
#10.3.4.53 update.beebee.vn
#10.3.4.53 metrics.beebee.vn
#10.3.4.53 service.beebee.vn
#10.3.4.53 beebee.vn
#10.3.4.53 beebee.com.vn
#10.3.4.53 beebee.com
#10.3.4.53 beebee.com
#10.3.4.53 beebee.vn
#10.3.4.53 beebee.beebee.com
#10.3.4.53 dev-update-browser.itim.vn
We need to activate and deactivate the dev environment for beebee server
3.What we need to work:
- Open new powershell window as administration
param([switch]$Elevated)
function Test-Admin {
$currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent())
$currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}
if ((Test-Admin) -eq $false) {
if ($elevated)
{
# tried to elevate, did not work, aborting
}
else {
Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated ' -f ($myinvocation.MyCommand.Definition))
}
exit
}
'running with full privileges'
- Replace the text:
Use Get-Content and Set-Content command to replace the text
(Get-Content C:\Windows\System32\drivers\etc\hosts -Raw) -replace '10.3.4.53','#10.3.4.53' | Set-Content -Path C:\Windows\System32\drivers\etc\hosts
- Replace the text with regex:
There are times, that we have many '#' character before the '10.3.4.53'. We would want to replace all the # with the '10.3.4.53' to '10.3.4.53'
So in this case, we need to do that with regex which also supported in powershell
(Get-Content C:\Windows\System32\drivers\etc\hosts -Raw) -replace '#+10.3.4.53','10.3.4.53' | Set-Content -Path C:\Windows\System32\drivers\etc\hosts
'#+10.3.4.53' --> '#+' means one or more '#' characters
- Provide conditions to run as if activate or deactivate the hosts file:
Using if and elseif in powershell
if ($action -like 'activate') {
(Get-Content C:\Windows\System32\drivers\etc\hosts -Raw) -replace '#+10.3.4.53','10.3.4.53' | Set-Content -Path C:\Windows\System32\drivers\etc\hosts
Sleep 2
echo $action
}elseif($action -like 'deactivate'){
(Get-Content C:\Windows\System32\drivers\etc\hosts -Raw) -replace '10.3.4.53','#10.3.4.53' | Set-Content -Path C:\Windows\System32\drivers\etc\hosts
Sleep 2
echo $action
}
- Provide value to $action param from command line
Define param for action in the script:
param([Parameter(Mandatory = $true,ValueFromPipeline = $true)]
[string]
$action, [switch]$Elevated)
function Test-Admin {
$currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent())
$currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}
if ((Test-Admin) -eq $false) {
if ($elevated)
{
# tried to elevate, did not work, aborting
}
else {
Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated -action "{1}"' -f ($myinvocation.MyCommand.Definition,$action))
}
exit
}
use that param '-action' when open new powershell as admin
--> Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated -action "{1}"' -f ($myinvocation.MyCommand.Definition,$action))
- How to run: Full script will be like:
param([Parameter(Mandatory = $true,ValueFromPipeline = $true)]
[string]
$action, [switch]$Elevated)
function Test-Admin {
$currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent())
$currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}
if ((Test-Admin) -eq $false) {
if ($elevated)
{
# tried to elevate, did not work, aborting
}
else {
Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated -action "{1}"' -f ($myinvocation.MyCommand.Definition,$action))
}
exit
}
'running with full privileges'
if ($action -like 'activate') {
(Get-Content C:\Windows\System32\drivers\etc\hosts -Raw) -replace '#+10.3.4.53','10.3.4.53' | Set-Content -Path C:\Windows\System32\drivers\etc\hosts
Sleep 2
echo $action
}elseif($action -like 'deactivate'){
(Get-Content C:\Windows\System32\drivers\etc\hosts -Raw) -replace '10.3.4.53','#10.3.4.53' | Set-Content -Path C:\Windows\System32\drivers\etc\hosts
Sleep 2
echo $action
}
Sleep 2
Stop-Process -Name "powershell"
Save the file as 'script.ps1' file:
Run from powershell as : .\script.ps1 -action 'activate' --> to activate
Run as .\script.ps1 -action 'activate' --> to deactivate
That's it. Hope this helps.
Notes: If you feel this blog help you and want to show the appreciation, feel free to drop by :
This will help me to contributing more valued contents.
Top comments (0)