PowerShell

imagesSono due giorni che sto “smanettando” con powershell: Sto creando una poweshell per importare i contatti Lync (Migrazione da Lync 2010 a Lync2013). Per risolvere il problema ho dovuto crearmi una lista di utenti lync e ciclare su ogni utente. Per ognuno ho dovuto creare un file zip, modificare un file xml e poi eseguire un altro comando della powershell di lync.

Dato che non sono molto pratico di powershell ho cercato un po’ su internet e alla fine sono riuscito a creare tutto quello che mi serviva, senza importare nessuna libreria esterna ma utilizzando la potenza di powershell. Vediamo come ho risolto il tutto:
Per iniziare mi sono creato dei metodi base per la gestione degli zip, delle cartelle e del file xml:
In questo post vedremo questo. Magari in futuro vi faro’ vedere i comandi lync…🙂

Prima di tutto ho creato delle cartelle temporanee per poter lavorare in tranquillita’:

#Tmp dir
$folderTmp = "C:\TmpLync\"
$folderTmpContact = "C:\TmpLync\Contacts"
#********************************************************************************************************************************************
#Start TMP FOLDER
#********************************************************************************************************************************************
#Clean and create all tmp dir
if (!(Test-Path $folderTmp)) {
# create it
[void](new-item $folderTmp -itemType directory)
}
if (!(Test-Path $folderTmpContact)) {
# create it
[void](new-item $folderTmpContact -itemType directory)
}

Poi ho creato le funzioni per zippare ed unzippare cartelle

function UnZipMe($zipfilename,$destination)
{
   $shellApplication = new-object -com shell.application
   $zipPackage = $shellApplication.NameSpace($zipfilename)
   $destinationFolder = $shellApplication.NameSpace($destination)
	# CopyHere vOptions Flag # 4 - Do not display a progress dialog box.
	# 16 - Respond with "Yes to All" for any dialog box that is displayed.
	$destinationFolder.CopyHere($zipPackage.Items(),20)
}

function ZipMe($srcdir,$ZipFileName,$zipFilepath )
{
		$zipFile = "$zipFilepath$zipFilename"
		#Prepare zip file
		if(-not (test-path($zipFile))) {
		    set-content $zipFile ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
		    (dir $zipFile).IsReadOnly = $false
		}

		$shellApplication = new-object -com shell.application
		$zipPackage = $shellApplication.NameSpace($zipFile)
		$files = Get-ChildItem -Path $srcdir | where{! $_.PSIsContainer}

		foreach($file in $files) {
		    $zipPackage.CopyHere($file.FullName)
			#using this method, sometimes files can be 'skipped'
			#this 'while' loop checks each file is added before moving to the next
		    while($zipPackage.Items().Item($file.name) -eq $null){
		        Start-sleep -seconds 1
		    }
		}
}

L’utilizzo di queste due funzioni e’ semplicissimo:
Per unzippare:

$zipFilename = "contacts.zip"
$a = gci -Path $folderTmpContact -Filter $zipFilename
foreach($file in $a)
{
    Write-Host "Processing - $file" UnZipMe –zipfilename
    UnZipMe –zipfilename $file.FullName -destination $file.DirectoryName
}

Per zippare:

$srcdir = $folderTmpContact
$zipFilepath = $folderTmp
ZipMe -srcdir $srcdir -zipFileName $ZipFileName -zipFilePath $zipFilepath

La parte piu’ complessa e’ stata la gestione e la modifica del file XML: Ho provato ad utilizzare i comandi standard per leggere un file xml:

$xml = New-Object XML
$xml = [xml](get-content "c:\test\DocItemSet.xml")
$email = $xml.DocItemSet.DocItem[0].name

Ma la stringa da ricercare non aveva logica e il file xml poteva cambiare. Alla fine ho deciso di utilizzare una semplice ricerca e modifica:

$original_file = "c:\test\DocItemSet.xml"
$destination_file =  "c:\test\DocItemSet.xml.new"
(Get-Content $original_file) | Foreach-Object {
    $_ -replace $email, 'something1aa'
    } | Set-Content $destination_file

In questo modo ricerco, modifico e faccio anche un backup del file.
Per lavorare e per debuggare poweshell ho utilizzato PowerGUI mentre per un ottimo punto di partenza per powershell consiglio questi link:

http://powershell.com/
http://powershell.it/Comandi/v1.0/Get-Content.aspx
http://powershell.it/Tutorial/Introduzione-a-PowerShell.aspx

NB: Se abbiamo il seguente errore File xyz.ps1 cannot be loaded because the execution of scripts is disabled on this system. Please see “get-help about_signing” for more details. Esesguiamo la console powershell ed eseguiamo il seguente comando:
Set-ExecutionPolicy Unrestricted -Force
Set-ExecutionPolicy RemoteSigned -Force

Spero di essere stato utile…
Buon divertimento a tutti!!!

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...