wrażliwość na wielkość

BnSOffTopic

ogólnie staram się szanować nasz piękny język i tępić 'kontenty’ czy 'autentykację’ [choć pewnie lada moment zostaną zapisane jako oficjalnie poprawne]. niemniej tłumaczenia niektórych fraz brzmią … zabiera trochę czasu, żeby się domyślić /: to na tyle jeśli w kwestii filozofii porannej, czas na gimnastykę z innego języka.

PS case sensivity

PS jest miły i przyjemny. stara się użytkownika we wszystkim wyręczyć, pomóc mu, wybaczyć błędy. czasem aż do przesady. ale jak każda istota, ma swoje odchyły, aberracje. tak też jest w przypadq traktowania wielkości znaków – ogólnie wszystko, dla ułatwienia, jest z automatu niewrażliwe na wielkości znaków. czyli mówiąc potocznie, jest baj difolt kejs-insensitive. są jednak wyjątki [bez których reguła nie mogłaby być pełna]:

  1. najbardziej zdradliwe, bo też i często używane, to ’-unique’. z jednej strony logiczne, że unikalne ma być unikalne… z drugiej, skoro PS jest nieczuły na stan [prawda,  że też ładne tłumaczenie?], to skąd nagle taka zmiana…
C:\...ive\_ScriptZ :))o- $PS='nExoR','nexor','Nexor'
C:\...ive\_ScriptZ :))o- $PS|select -Unique

nExoR
nexor
Nexor

jak widać, każdy =))o- jest unikalny. rozsądnie. tak samo zresztą zachowuje się polecenie 'get-unique’, a mogłoby się wyróżniać choćby dodatkowym parametrem ’-CI’. ale się nie wyróżnia.

na każdego jest oczywiście metoda, tzw. walec. takim walcem w PS jest sortowanie, które również posiada parametr ’-unique’, ale ten unique jest bardziej unique niż inne, bo jest właśnie nieczuły na wielkość:

C:\...ive\_ScriptZ :))o- $PS|sort -Unique

Nexor

[to nie jest prawidłowy =))o- ]

  1. drugim przykładem, zapewne bardziej [nomen omen] unikalnym, są wyrażenia regularne. oczywiście i tutaj są dwie wariacje – CI i CS, więc trzeba uważać. jeśli używa się zwykłych reguł 'match’ lub 'replace’, zachowuje się standardowo [czyli nie zwraca uwagi na wielkość znaków]:
C:\...ive\_ScriptZ :))o- $PS='nExoR jest Niewrażliwy Na Walizki'
C:\...ive\_ScriptZ :))o- $PS -match 'nexor'

True

jeśli jednak zdefiniuje się wyrrega [tak pewnie nazywał by się w polskiej wersji Logo. tłumaczone języki to  sqcha] … regexa, to zachowuje się inaczej [czyli CS]:

C:\...ive\_ScriptZ :))o- $PS='nExoR jest Niewrażliwy Na Walizki'
C:\...ive\_ScriptZ :))o- [regex]$rxeN="nexor"
C:\...ive\_ScriptZ :))o- $PS -match $rxeN

False

zmusić regexa do niewrażliwości można na dwa sposoby – albo definiując dodatkową opcję podczas deklaracji, lub modyfiqjąc samą definicję wyrażenia. pierwsza wersja może przestraszyć swoją monstrualnością, ale jak się w kodzie definiuje wiele regexów to warto raz zdefiniować i potem używać:

C:\...ive\_ScriptZ :))o- $PS='wyczUleniE na poKrowce to nie nExoR'
C:\...ive\_ScriptZ :))o- $rxOptCI = ([System.Text.RegularExpressions.RegexOptions]::IgnoreCase -bor [System.Text.Regular
Expressions.RegexOptions]::Compiled)
C:\...ive\_ScriptZ :))o- $rxeN=New-Object System.Text.RegularExpressions.Regex("nexor",$rxOptCI)
C:\...ive\_ScriptZ :))o- $PS -match $rxeN

True

opcje są wartością binarną, której każdy bit ma inne znaczenie. stąd binarny OR modyfiqjący jej wartość. jeśli wyrażeń regularnych w kodzie jest niewiele, bardziej opłaca się CI ustawić w jego definicji:

C:\...ive\_ScriptZ :))o- $PS='deLikAtny ProCeS nExoRa'
C:\...ive\_ScriptZ :))o- [regex]$rxeN="(?i)nexor"
C:\...ive\_ScriptZ :))o- $PS -match $rxeN

True

PostScriptum

znajomość sztuczek i tricków języka jest bardzo przydatna. można zaoszczędzić wiele linii kodu, a czasem bardzo wiele czasu, zmarnowanego na wyważanie otwartych okien. polecam również zajrzeć na powershellpl.net, ponieważ Bartek się w końcu uaktywnił.

eN.

 

 

hurtowe pobranie mediów z doqmentów office

dziś ponownie goszczę na blogu Adriana, który zasila WF systemowymi tips’n’tricks (:

.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.

Jak szybko „wyciągnąć” wszystkie zdjęcia i video z pliku Powerpoint , Word lub Excel?

Niejednokrotnie spotkałem się z prośbą lub pytaniem znajomych o szybki sposób na hurtowy eksport obiektów z plików pakietu Office. Oczywiście, można to zrobić ręcznie, eksportując każde ze zdjęć, ale nie o to przecież chodzi.

Otóż jest pewien sposób na dość szybkie wydobycie z naszych prezentacji lub dokumentów wszystkich mediów – zdjęć, dźwięków lub Video – w formie oddzielnych plików.

Jak to zrobić ?

Wystarczy zmienić rozszerzenie pliku np. powerpoint’a z PPTx na zip:

media02media01


po dokonaniu zmiany wystarczy dwukrotnie kliknąć na archiwum i w strukturze folderów wyszukać folder Media w którym to będą pliki których szukamy.

media03

Adrian Szwejkowski

.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.

eN.

ReadKey()

Windows_PowerShell_iconniektóre skrypty powinny pozwolić na dodanie wyboru akcji w trakcie przetwarzania – typu ’wykonanie akcji A, naciśnij 'A’, akcja B, naciśnij 'B’, wyjdź 'W”… ogólnie należy unikać takiego kodu ale czasem chcemy zrobić skrypt 'miły’, user-friendly. metod jest kilka, a im bardziej user-friendly tym mniej uniwersalna.

źle

najładniejszą będzie oczywiście dodanie formatki GUI. formatka GUI wymaga bibliotek graficznych. znaleźć można różne wynalazki, z których najśmieszniejszy to korzystanie z WSH O_o’  [ nieznoszę takich frankensteinów]. .NET zawiera oczywiście odpowiednie klasy, można więc skorzystać z klasy System.Windows.Forms.Messagebox – tutaj praktyczny przykład. podstawowe wady tej metody to: wymaga bibliotek Forms, czyli nie zadziała na wersjach Core, oraz nie zadziała w sesjach zdalnych (remoting).

lepiej

inną metodą jest zwykły ReadKey. trzeba niemniej uważać na sposób jego wywołania. najprostsza metoda wywali się w sesji zdalnej:

[remote]: PS C:\scriptz> [console]::ReadKey()
Exception calling "ReadKey" with "0" argument(s): "Cannot read keys when either application does not have a console or
when console input has been redirected from a file. Try Console.Read."
At line:1 char:1
+ [console]::ReadKey()
+ ~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : InvalidOperationException

można zatem użyć metody z obiektu host:

[remote]: PS C:\scriptz> $host.UI.RawUI.ReadKey("NoEcho,includeKeyDown")

               VirtualKeyCode                     Character               ControlKeyState                       KeyDown
               --------------                     ---------               ---------------                       -------
                           89                             y                             0                          True

ta jednak metoda wymaga, aby host ją obsługiwał, czyli nie zadziała np. w ISE.

najlepiej

najbardziej natywny 'PowerShell’ to wykorzystanie metody PromptForChoice obiektu Host.UI, z którego korzystają commandlety. Dzięki temu zachowany jest spójny 'user-experience’, a metoda zadziała w sesji zdalnej, ISE, konsoli itp, itd [w ISE wyświetli okienko (: ]:

$title = "Delete Files"
$message = "Do you want to delete the remaining files in the folder?"

$yes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", `
    "Deletes all the files in the folder."

$no = New-Object System.Management.Automation.Host.ChoiceDescription "&No", `
    "Retains all the files in the folder."

$options = [System.Management.Automation.Host.ChoiceDescription[]]($yes, $no)

$result = $host.ui.PromptForChoice($title, $message, $options, 0)

switch ($result)
    {
        0 {"You selected Yes."}
        1 {"You selected No."}
    }

[kod z Technet]

eN.