Czasem zdarza nam się, że trzeba napisać w Powershell coś bardziej skomplikowanego, niż skopiowanie pliku z miejsca A do miejsca B. Dajmy na to próbujemy oskryptować jakąś logikę finansową i potrzebujemy napisać sobie funkcję wyliczającą kwotę miesięcznej spłaty kredytu ze stałym, znanym oprocentowaniem, ilością rat i kwotą pożczyczki.
Oczywiście możemy sobie tę funkcję napisać od zera "na piechotę" - matematyka, która się za nią kryje, nie jest aż tak znowu skomplikowana:
Function PMT($stopa, $ile_rat, $kwota) {
$stopa * $kwota * [math]::Pow((1 + $stopa), $ile_rat) / (1 - [math]::Pow((1 + $stopa), $ile_rat)
}
Takie podejście ma sporo zalet:
- Walor edukacyjny
- Lepsza kontrola nad tym, co nasz skrypt robi
- Własność intelektualna (? tu można się kłócić, bo kod też można od kogoś zerżnąć...)
Główna wada jest natomiast taka, że często będziemy wynajdywać koło, a więc tak naprawdę marnować czas, który moglibyśmy przeznaczyć na coś bardziej twórczego.
W przypadku funkcji PMT takim kołem, którego nie musimy wynajdować, jest Excel. Tam PMT jest przecież od dawna, wystarczy sięgnąć...
Ale że niby jak?
Otóż, okazuje się, całkiem prosto:
[reflection.assembly]::LoadWithPartialName( "Microsoft.Office.Interop.Excel" ) | Out-Null
$Global:XL = New-Object -ComObject Excel.Application
Od tej pory mamy w skrypcie globalną zmienną reprezentującą... Nie, źle mówię. *Będącą* ukrytą, ale w pełni funkcjonalną instancją aplikacji Excel, wraz z całym dobrodziejstwem inwentarza:
$Global:XL.WorksheetFunction.Pmt(0.1/12, 12, 1000)
Ładujemy Excela do pamięci *raz* (zajmuje to niestety około pół sekundy nawet na dość szybkim komputerze) i potem możemy wywoływać w skrypcie funkcje excelowe - będą działać prawie tak samo szybko, jak te napisane przez nas, a w bardziej skomplikowanych przypadkach nawet szybciej.
Smacznego!
Jeżeli chcesz do komentarza wstawić kod, użyj składni:
[code]
tutaj wstaw swój kod
[/code]
Jeżeli zrobisz literówkę lub zmienisz zdanie, możesz edytować komentarz po jego zatwierdzeniu.