Search PowerShellers and other PowerShell-related sites

Monday, March 26, 2007

Spring-cleaning of a PowerShell profile

After I read James Manning's post why share-able functions shouldn't be in your PowerShell profile, I have looked in my $profile. It was far from small file focused on prompt function, transcript function, one-liners and aliases. So, I created a few subfolders (AD, ISA, Exchange, Misc, Test...) for my scripts in WindowsPowerShell folder. Also, the functions found their place in dedicated folder Functions. The only thing that left is to put all folders with scripts in my path and to dot-source functions from Functions folder.


$profilehome = ([System.IO.FileInfo]$PROFILE).DirectoryName

dir $profilehome | where {$_.PsIsContainer -and ($_.name -ne "functions")} | %{$env:path += ";" + $profilehome + "\" + $_.name}

dir ($profilehome + "\functions") | where {!$_.PsIsContainer} |
%{. ($profilehome + "\functions\" + $_.name)}



$profile is now clean and tidy, and in James Manning's words - it's a far more robust, maintainable, shareable, and supportable situation than before.

Wednesday, March 14, 2007

Daily notes with PowerShell

The post at Holistic Detection blog gave me an idea how to keep my daily notes organized and just a few keystrokes away.


function New-DailyNotes {

# store files in subfolder notes in WindowsPowerShell folder
$path = (join-path ([System.IO.FileInfo]$profile).DirectoryName \notes\)
# files will be named like 2007-03-14_notes.txt
$notesfile = (get-date).ToString("yyyy-MM-dd") + "_notes.txt"

if( !(test-path $path ) )
{
# create the notes directory if it doesn't exist
new-item -path $path -type directory
}

$notespath = (join-path $path $notesfile)
if( !(test-path $notespath ) )
{
# create the notes file if it doesn't exist
new-item -path $path -name $notesfile -type "file"
notepad $notespath
}
else
{
notepad $notespath
}

}

set-alias dn New-DailyNotes



I've added this function to the profile file and I only have to type dn to get access to my daily notes file.

Sunday, November 12, 2006

Osnove - Uvod u objektni model

Ključna stvar u čemu se Windows PowerShell razlikuje od sličnih shell okruženja jeste osobina da radi isključivo sa objektima. Rezultat komande koju kucate u shell-u na Linux-u je tekst. Na primer

#ps -e
PID TTY TIME CMD
1 ? 00:08:00 init
12021 ? 00:00:00 kdm



Ukoliko sada želimo da prekinemo proces kdm moramo da izdvojimo deo teksta koji se odnosi na broj procesa (PID kolona) i da ga prosledimo kao parametar komandi za prekid procesa (kill).

# ps -e | grep " kdm" | awk '{ print $1 }' | xargs kill



Problem ovog pristupa je da veci deo vremena provodimo formatirajući tekst, što može da bude složeno i zamorno, ali se zato sve komanda se izvršavaju gotovo trenutno.

Windows PowerShall sa druge strane radi sa objektima. Pogledajmo šta se dešava ako otkucamo komandu dir

PS> dir

Directory: Microsoft.PowerShell.Core\FileSystem::C:\

Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 9/23/2006 2:23 PM ATI
d---- 9/21/2006 10:41 PM Documents and Settings
...



Iako reuzultat izgleda kao par redova teksta, u stari u pitanju je niz objekata koji su tipa System.IO.FileInfo. Ukoliko vas ovo podseća na .NET, u pravu ste, osnova Windows PowerShell-a jeste .NET.

Komande su u stvari funkcije čiji su ulazi i izlazi objekti. Ako se vratimo našem primeru koji prekida proces kdm, ekvivalentan primer bi u PS bi bio:

PS> get-process kdm | stop-process



Vidi se da je zapis mnogo čitljiviji, jedina mana je što se malo gubino na brzini. Meni se iskreno ovo mnogo više sviđa, jer se kod lakše i brže piše.

Ovo se može mnogo bolje videti na malo složenijem primeru, sledeće komande prekidaju sve procese koji troše više od 10MB memorije.

bash

# ps -el | awk '{ if ( $6 > (1024*10)) { print $3 } }' | grep -v PID | xargs kill



Windows PowerShell

PS> get-process | where { $_.VS -gt 10M } | stop-process



Čak i ako nikada niste videli PowerShell, velika je verovatnoća da će te samo na osnovu koda razumeti o čemu se radi. Što se bash-a tiče tu ne bih bio tako siguran.

Ovo je tek početak, u sledećem tekstu videćemo da su i promenljive objekti. Takođe videćemo kako lako možemo da saznamo koji svi properties i methods postoje za neki objekat.

Friday, October 20, 2006

Code Test 2

1: $a = ipconfig /all | findstr "172.16.1." | %{$_.remove(0,44)}
2: route add 192.168.0.0 mask 255.255.0.0 $a

Thursday, October 19, 2006

Da li ste već čuli za Windows PowerShell?

Windows PowerShell. Najvrelija stvar koja ovih dana stiže iz Redmonda. Šta je Windows PowerShell? Da se ne bih pravio pametniji od samih tvoraca, pravo je vreme da ubacim mali citat, direktno sa MS sajta - "Microsoft Windows PowerShell command line shell and scripting language helps IT Professionals achieve greater productivity. Using a new admin-focused scripting language, more than 130 standard command line tools, and consistent syntax and utilities, Windows PowerShell allows IT Professionals to more easily control system administration and accelerate automation." Ključne reči su: command line shell, scripting language i admin-focused.

Kao da se svakog dana pojavljuju novi blogovi koji se njime bave (a još se nije ni pojavila finalna verzija). Jedna od udarnih tema na Tech·Ed 2007 u Barseloni biće upravo PowerShell. Informacija ima toliko da čovek ne zna šta pre da pročita, koji skript pre da proba. Odabrane izvore informacija naći ćete u okviru sidebar-a. U vrlo skoroj budućnosti nećete moći administirati Windows sisteme bez znanja PowerShell-a. Ne čekajte finalnu verziju. Preuzmite trenutno aktuelan Windows Powershell 1.0 RC2 (potreban vam je i .NET Framework 2.0, ako ga već nemate instaliran) i zaronite u najbolji shell na svetu. The shell must flow.