search
Categories
Sponsors
VirtualMetric Hyper-V Monitoring, Hyper-V Reporting
Archive
Blogroll

Badges

Microsoft PowerShell MVP
MCSE
Sponsors

Cozumpark Bilisim Portali
Posted in Windows Powershell | No Comment | 164 views | 15/07/2015 12:53

There are many ways to validate an ip address in PowerShell. Common method is usually regex. But if you want to validate both IPv4 and IPv6 ip address in same Regex query, then life could be difficult. For example this is an query example for ipv4 and ipv6 validator regex:

'/^(?>(?>([a-f0-9]{1,4})(?>:(?1)){7}|(?!(?:.*[a-f0-9](?>:|$)){8,})((?1)(?>:(?1)){0,6})?::(?2)?)|(?>(?>(?1)(?>:(?1)){5}:|(?!(?:.*[a-f0-9]:){6,})(?3)?::(?>((?1)(?>:(?1)){0,4}):)?)?(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?>\.(?4)){3}))$/iD'

Personally I don’t want to deal with this kind of Regex queries. It’s hard to read, easy to make mistake. So let’s try another simple way, using [ipaddress] type.

1
2
3
4
5
6
7
8
9
10
11
PS C:\Users\Yusuf> [ipaddress]"10.10.10.0"
 
Address            : 657930
AddressFamily      : InterNetwork
ScopeId            :
IsIPv6Multicast    : False
IsIPv6LinkLocal    : False
IsIPv6SiteLocal    : False
IsIPv6Teredo       : False
IsIPv4MappedToIPv6 : False
IPAddressToString  : 10.10.10.0

As you see, it validates ipv4 address. So what about ipv6?

1
2
3
4
5
6
7
8
9
10
11
12
PS C:\Users\Yusuf> [ipaddress]"::1"
 
 
Address            :
AddressFamily      : InterNetworkV6
ScopeId            : 0
IsIPv6Multicast    : False
IsIPv6LinkLocal    : False
IsIPv6SiteLocal    : False
IsIPv6Teredo       : False
IsIPv4MappedToIPv6 : False
IPAddressToString  : ::1

Yes, it pretty works with ipv6 address. So what happens if I use a string?

1
2
3
4
5
6
7
PS C:\Users\Yusuf> [ipaddress]"::a333SSSSS"
Cannot convert value "::a333SSSSS" to type "System.Net.IPAddress". Error: "An invalid IP address was specified."
At line:1 char:1
+ [ipaddress]"::a333SSSSS"
+ ~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvalidCastParseTargetInvocation

So we can simply use something like this for validation:

1
2
3
4
if ("10.10.10.0" -as [ipaddress])
{
   write-output Validated!
}

Now you can use your expression between if blocks.


Posted in Windows Powershell | No Comment | 124 views | 15/06/2015 12:28

Some WMI queries may be effected from system performance, so queries may run very long times. In some cases, I see that wmi query hangs, so PowerShell script is not able to continue. In that cases, we should use timeout parameter.

Since CIM is the new method for us, we should go with CIM. For example this is our WMI query:

Get-WmiObject -Class "Win32_PerfFormattedData_PerfProc_Process"

If you run this on PowerShell, you will notice that it will takes for a while. So lets run same query with CIM:

Get-CimInstance -Class "Win32_PerfFormattedData_PerfProc_Process" -OperationTimeoutSec 15

As you see, CIM and WMI query is almost same. But additionally I’ve added OperationTimeoutSec parameters to avoid from hangs. That gives us ability to cancel query if it takes more than 15 seconds. You can change it anytime you want.


Posted in Windows Powershell | No Comment | 325 views | 28/05/2015 10:54

Following script will get System Logs in last hour.

1
2
3
4
5
6
7
8
9
# System Log Parameters
$SystemLogParameters = @{
LogName= "System"
EntryType= "Error","Warning"
After= (Get-Date).AddHours(-1)
}
 
# Get System Logs
Get-EventLog @SystemLogParameters

You can set scope by changing EntryType parameter.


Posted in Windows Powershell | No Comment | 320 views | 28/05/2015 10:51

Following script will get Application Logs in last hour with “vmic*” source logs.

1
2
3
4
5
6
7
8
9
# Application Log Parameters
$ApplicationLogParameters = @{
LogName= "Application"
EntryType= "Error","Warning"
After= (Get-Date).AddHours(-1)
}
 
# Get Application Logs
Get-EventLog @ApplicationLogParameters -Source vmic*

You can set scope by changing EntryType parameter.


Posted in Windows Powershell | No Comment | 347 views | 28/05/2015 10:47

Following creates a new event log folder called “yusufozturk” in your Application Log Folder.

1
2
3
4
5
# Create Event Log
New-EventLog -LogName "yusufozturk" -Source "Hyper-V" -EA SilentlyContinue
 
# Limit Event Log Properties
Limit-EventLog -LogName "yusufozturk" -OverflowAction "OverWriteAsNeeded" -MaximumSize 100MB -EA SilentlyContinue

As you see, you can also set OverFlowAction and MaximumSize.


Posted in Windows Powershell | No Comment | 382 views | 23/04/2015 16:34

** This is alternative custom script to Compress-Archive for wide range compatibility **

I’ve recently installed Windows Server 2016 as Core installation. Due to there is no shell, my old PowerShell script didn’t work:

1
2
3
4
5
6
7
8
$ShellApplication = New-Object -com Shell.Application
$ZipPackage = $ShellApplication.NameSpace($ZipPath)
 
foreach($File in $input) 
{ 
	$ZipPackage.CopyHere($File.FullName)
	Start-Sleep -milliseconds 5
}

As you see, I’ve used Shell Application before. But now, I’m not able to run that on Server 2016 Core.

So I searched on internet about it and found MVP Jeffrey Hick‘s post:

I used that codes and made a zip function:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
function ConvertTo-CompressedFile
{
	param([string]$ZipPath)
 
	# Get Files
	[string[]]$Files = $input.FullName;
 
	if ($Files -ne $Null)
	{
		# Load the assembly
		[System.Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem") | Out-Null
 
		# Check Zip Extension
		if ($ZipPath -notlike "*.zip")
		{
			Write-Output "Please check your zip file path."
			break;
		}
 
		# Check Zip Path
		if(-not (Test-Path($ZipPath)))
		{
			# Get Zip File Name
			$ZipName = $ZipPath.Split("\")[-1]
 
			if ($ZipPath -notlike "*\*")
			{						
				# Get Current Location
				$CurrentLocation = (Get-Location).Path
 
				# Get Current Zip File Path
				$CurrentZipPath = $CurrentLocation + "\" + $ZipName
 
				# Update Zip Path
				$ZipPath = $CurrentZipPath;
			}
 
			# Create Zip File
			Set-Content $ZipPath ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
 
			# Set File Attributes
			(Get-ChildItem $ZipPath).IsReadOnly = $false
		}
 
		# Get Zip File
		$ZipFile = [System.IO.Compression.ZipFile]::Open($ZipPath,"Update")
 
		foreach($File in $Files)
		{
			# Get File Name
			$FileName = $File.Split("\")[-1]
 
			# Compress File
			[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($ZipFile,$File,$FileName,"optimal") | Out-Null
 
			# Buffer
			Start-Sleep -milliseconds 5
		}
 
		# Close Zip File
		$ZipFile.Dispose()
 
		# Output Zip Path
		$ZipPath
	}
}

So you can easily compress any file on Windows Server 2016.

Usage:

Get-ChildItem MyFile.txt | ConvertTo-CompressedFile C:\MyFile.zip

Also it works for current directories:

Get-ChildItem MyFile.txt | ConvertTo-CompressedFile MyFile.zip

If zip file is not exist, that will be created by this script.

Note: This script requires .Net 4.5 Core installed on Windows Server 2016.


Posted in Windows Server | No Comment | 937 views | 04/03/2015 10:36

If you want to see SQL Server Shrink status, you can use following query:

SELECT 
	percent_complete,
	total_elapsed_time,
	start_time,
	status,
	estimated_completion_time
FROM 
	sys.dm_exec_requests
WHERE
	command = 'DbccFilesCompact'

This is also a reminder for me :)