Sample Codes

Change Modified Date of All file in a folder

Get-ChildItem s1 | foreach {
    $item=$(Get-Item $_.FullName)
    Set-ItemProperty -path $item -Name LastWriteTime -Value $(Get-Date).AddHours(-5)
}

Test Ntework Connection

param (
    [switch]$NoUser,
    [int]$Interval = 20,
    [string]$AdditionalAddressList="10.1.1.1,11.1.1.1",
    [switch]$NoFileLog,
    [string]$LogFile = "output.txt",
    [string]$DNSCheckHost = "google.com"
)

if ($args.Count -eq 0) {
    Write-Host "Testing network connection..."
    Write-Host "Use -h option for additional parameters and help."
    Write-Host
}
if ($args -contains '-h') {
    Write-Host "Usage: .\YourScript.ps1 [-NoUser] [-Interval <seconds>] [-AdditionalAddressList <list>] [-NoFileLog] [-LogFile <path>]"
    Write-Host ""
    Write-Host "Parameters:"
    Write-Host "  -NoUser                  Do not log user name"
    Write-Host "  -Interval <seconds>      Set interval between checks (default: 20 seconds)."
    Write-Host "  -AdditionalAddressList   Comma-separated list of addresses to ping."
    Write-Host "  -NoFileLog               Disable logging to file."
    Write-Host "  -LogFile <path>          Specify log file path (default: output.txt)."
    Write-Host "  -DNSCheckHost <FQDN>     Specify FQDN of host to check DNS resolution"
    Write-Host ""
    Write-Host "Examples:"
    Write-Host "  .\YourScript.ps1 -Interval 30 -AdditionalAddressList '8.8.8.8, bing.com'"
    Write-Host "  .\YourScript.ps1 -NoUser -LogFile 'netlog.txt'"
    Write-Host "  .\YourScript.ps1 -NoUser -NoFileLog"
    Write-Host "  .\YourScript.ps1 -DNSCheckHost google.com"
    Write-Host "  .\YourScript.ps1 -h"
    exit
}

# Additional Test Address
$AdditionalAddresses = @()
if ($AdditionalAddressList) {
    $AdditionalAddresses = $AdditionalAddressList -split ',' | ForEach-Object { $_.Trim() }
}

function Write-Log {
    param (
        [string]$message,
        [ConsoleColor]$ForegroundColor = 'White'  # Default color
    )
    $logdate=$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')
    if (-not $NoFileLog) {
        Add-Content -Path $logFile -Value "$logdate - $message"
    }
    Write-Host "$logdate - $message" -ForegroundColor $ForegroundColor
}

while ($true) {

    # Get current user info unless -NoUser is specified
    if ($NoUser) {
        $output = "Computer: $env:COMPUTERNAME"
    } else {
        $output = "Computer: $env:COMPUTERNAME - User: $env:USERDOMAIN\$env:USERNAME"
    }
    Write-Log $output

    # Header for adapter info
    $header = "{0,-20} {1,-40} {2,-10} {3,-10} {4,-15} {5,-17}" -f "Name", "Description", "Status", "Speed", "IP Address", "MAC Address"
    Write-Log $header

    # Get active adapters
    $adapters = Get-NetAdapter | Where-Object { $_.Status -eq "Up" }

    foreach ($adapter in $adapters) {
        $ipInfo = Get-NetIPAddress -InterfaceIndex $adapter.InterfaceIndex | Where-Object { $_.AddressFamily -eq "IPv4" }

        foreach ($ip in $ipInfo) {
            $line = "{0,-20} {1,-40} {2,-10} {3,-10} {4,-15} {5,-17}" -f $adapter.Name, $adapter.InterfaceDescription, $adapter.Status, $adapter.LinkSpeed, $ip.IPAddress, $adapter.MacAddress
            Write-Log $line
        }
    }

    foreach ($adapter in $adapters) {
        #$ipInfo = Get-NetIPAddress -InterfaceIndex $adapter.InterfaceIndex | Where-Object { $_.AddressFamily -eq "IPv4" }
        $gwInfo = Get-NetRoute -InterfaceIndex $adapter.InterfaceIndex | Where-Object { $_.DestinationPrefix -eq "0.0.0.0/0" }
        #Write-Host $gwInfo.NextHop
        $dnsInfo = Get-DnsClientServerAddress -InterfaceIndex $adapter.InterfaceIndex #| Where-Object { $_.AddressFamily -eq "IPv4" }
        #Write-Host $dnsInfo.ServerAddresses

        # Add default gateway to address list
        foreach ($gw in $gwInfo) {
            if ($gw.NextHop -ne "0.0.0.0") {
                $gateway=$gw.NextHop
                $pingResult = Test-Connection -ComputerName $gateway -Count 1 -Quiet
                if ($pingResult) {
                    $successMsg = "Ping to gateway $gateway successful."
                    Write-Log $successMsg -ForegroundColor Green
                } else {
                    $failMsg = "Ping to gateway $gateway failed. Firewall may block ping though."
                    Write-Log $failMsg -ForegroundColor Red
                }
            }
        }

        # Add DNS servers to address list
        foreach ($dns in $dnsInfo.ServerAddresses) {
                $pingResult = Test-Connection -ComputerName $dns -Count 1 -Quiet
                if ($pingResult) {
                    $successMsg = "Ping to dns server $dns successful."
                    Write-Log $successMsg -ForegroundColor Green
                } else {
                    $failMsg = "Ping to dns server $dns failed. Firewall may block ping though."
                    Write-Log $failMsg -ForegroundColor Red
                }
            }

        # Try resolving using each DNS server until one succeeds
        foreach ($dns in $dnsInfo.ServerAddresses) {
            try {
                $resolveResult = Resolve-DnsName -Name $DNSCheckHost -Server $dns -ErrorAction Stop
                if ($resolveResult) {
                    $successMsg = "DNS resolution for $DNSCheckHost using server $dns succeeded."
                    Write-Log $successMsg -ForegroundColor Green
                    break
                }
            } catch {
                $failMsg = "DNS resolution for $DNSCheckHost using server $dns failed."
                Write-Log $failMsg -ForegroundColor Red
            }
        }


        foreach ($address in $AdditionalAddresses) {
            # Check if the address is an IP address using regex
            if ($address -match '^\d{1,3}(\.\d{1,3}){3}$') {
                # It's an IPv4 address, skip DNS resolution
                $ping = Test-Connection -ComputerName $address -Count 1 -Quiet
                if ($ping) {
                    $successMsg = "Ping to $address successful."
                    Write-Log $successMsg -ForegroundColor Green
                } else {
                    $failMsg = "Ping to $address failed. Firewall may block ping though."
                    Write-Log $failMsg -ForegroundColor Red
                }
            } else {
                # It's a DNS name, resolve first
                try {
                    $dnsResults = Resolve-DnsName -Name $address -ErrorAction Stop
                    $aRecords = $dnsResults | Where-Object { $_.Type -eq 'A' }

                    if ($aRecords.Count -eq 0) {
                        $noARecordMsg = "DNS resolution for $address succeeded, but no A records were found."
                        Write-Log $noARecordMsg -ForegroundColor Yellow
                    } else {
                        foreach ($result in $aRecords) {
                            $ip = $result.IPAddress
                            $ping = Test-Connection -ComputerName $ip -Count 1 -Quiet
                            if ($ping) {
                                $successMsg = "Ping to $address ($ip) successful."
                                Write-Log $successMsg -ForegroundColor Green
                            } else {
                                $failMsg = "Ping to $address ($ip) failed. Firewall may block ping though."
                                Write-Log $failMsg -ForegroundColor Red
                            }
                        }
                    }
                } catch {
                    $errorMsg = "DNS resolution failed for $address. Error: $_"
                    Write-Log $errorMsg -ForegroundColor Yellow
                }
            }
        }
    }
    Write-Host ""
    Start-Sleep -Seconds $Interval
}

Last updated