Background
This should include addresses which are written in safe format, with dots in brackets, like:
- 192.168.0[.]1
- 192.168.0(.)1
Solution
How it works
- Input,
- Working,
- Output
W przypadku obiektów posiadających wiele właściwości przydaje się możliwość ich przeszukiwania wg fragmentu ich nazwy. Na przykład obiekt ma setki właściwości, ale chcemy wyświetlić wyłącznie te, które zawierają określone słowo.
Nazwy właściwości wyświetlane są po lewej (na zielono), a ich wartości po prawej stronie |
Może to nie jest zbyt szczęśliwy wybór, ale przypuśćmy, że z komendy Get-Date chcemy wyświetlić wszystkie właściwości, które zawierają w swojej nazwie ciąg day.
for ($i=1; $i -le 10; $i++){(Get-Random -Minimum 1 -Maximum 255).ToString() + '.' + (Get-Random -Minimum 1 -Maximum 255).ToString() + '.' + (Get-Random -Minimum 1 -Maximum 255).ToString() + '.' + (Get-Random -Minimum 1 -Maximum 255).ToString()}
Wynik działania komendy generującej adresy IP |
$howMuchShouldBeGenerated = 10 #ile adresów ma zostać wygenerowanych
$IPs = @()
for ($i=1; $i -le $howMuchShouldBeGenerated; $i++){
$IP = ""
for ($j=1; $j -le 4; $j++){
$oktet = (Get-Random -Minimum 1 -Maximum 255).ToString()
$IP += $oktet
if ($j -le 3){
$IP += "."
}
}
$IPs += $IP
}
$IPs
W celu rozwiązywania problemu z jakąś usługą, może się przydać prosty monitoring polegający na sprawdzaniu jej statusu w podanym interwale czasowym.
Poniższy jednolinijkowiec wykonuje takie właśnie zadanie.
$serviceName = 'nazwa_usługi'; while ($TRUE) {start-sleep -Seconds 5; write-output "$(get-date -format "HH:mm:ss") : $((get-service -name $serviceName).Name) : $((get-service -name $serviceName).Status)"}
W powyższym kodzie proszę zwrócić uwagę na miejsca oznaczone na czerwono. Oczywiście 'nazwa_uslugi' to nic innego jak nazwa usługi, którą chcemy monitorować (nazwy usług można podejrzeć np. poleceniem Get-Service).
Z kolei cyfra 5 oznacza interwał czasowy w sekundach pomiędzy sprawdzeniami.
Rezultat jego działania widać poniżej.
$serviceName = 'spooler'; while ($TRUE) {start-sleep -Seconds 5; write-output "$(get-date -format "HH:mm:ss") : $((get-service -name $serviceName).Name) : $((get-service -name $serviceName).Status)" | Tee-Object -file plik.txt -append}
Poniżej wklejam prostą komendę w PowerShellu, która pozwoli przeszukać wszystkie pliki tekstowe w folderze pod kątem podanego ciągu znaków.
Przydatne zwłaszcza kiedy w gąszczu logów trzeba znaleźć określoną frazę.
Get-ChildItem -File | ForEach-Object {Select-String -Path $_.FullName -Pattern 'daniel'}
Get-ChildItem *.txt -File | ForEach-Object {Select-String -Path $_.FullName -Pattern 'daniel'}
Get-ChildItem *.txt -Recurse -File | ForEach-Object {Select-String -Path $_.FullName -Pattern 'daniel'}
Do przeszukania poszły dwa pliki. Pierwszy ze słowami angielskimi, drugi z polskimi:
Wynik działania opisywanej komendy w PowerShellu |
No i to w sumie tyle. Jedna linijka, a potrafi zaoszczędzić dużo czasu :)
Przykładowa sytuacja.
Na Pulpicie macie dużo folderów w których jest dużo plików. Zapiszecie coś w którymś z tych podfolderów. Nie pamiętacie nazwy, ani folderu w którym plik został umieszczony.
Wtedy nerwowość szukania zapisanego dokumentu staje odwrotnie proporcjonalnie do pozostałego czasu, czyli im mniej czasu, tym większe zdenerwowanie ;)
W takich sytuacjach może się przydać poniższy "jednolinijkowiec".
Get-ChildItem -Recurse -File | Select-Object -Property FullName, LastWriteTime | Sort-Object LastWriteTime -Descending | Select-Object -First 30
Jeżeli więc chcecie wyświetlić 30 ostatnio zapisanych / zmodyfikowanych plików na Pulpicie i jego podfolderach należy odpalić PowerShella, przejść na Pulpit i wkleić powyższy kod.
Oczywiście zamiast przechodzenia do folderu i uruchamiania kodu, ścieżkę do przeszukania można podać poprzez parametr -Path dla polecenia Get-ChildItem. Również do tego polecenia można dodać parametr -Hidden, który spowoduje wyświetlanie także ukrytych plików.
Kod uzupełniony o te dwa parametry będzie miał zatem postać:
Get-ChildItem -Path "ścieżka_do_przeszukania" -Recurse -File -Hidden| Select-Object -Property FullName, LastWriteTime | Sort-Object LastWriteTime -Descending | Select-Object -First 30
Całkiem przydatna rzecz, zwłaszcza jeśli do przeanalizowania są dziesiątki folderów z tysiącami plików.
Jak włączyć Pulpit Zdalny na maszynie do której nie macie fizycznego dostępu, a jedynie poprzez PowerShella?
Otóż w sposób jak poniżej (działa na Windows 10).
Enter-PSSession -ComputerName "nazwa_komputera" -Credential (Get-Credential)
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -name "fDenyTSConnections" -value 0
Enable-NetFirewallRule -DisplayGroup "*Pulpit zdalny*"
Co robicie gdy macie potrzebę dodania do listy gotowych ciągów znaków (lub liczb) jakiegoś tekstu na początku i końcu? Dla przykładu chcielibyście z przodu tekstu dodać słowo "przód", a tyłu słowo "tył" (prawda, że jestem kreatywny? ;D)
Macie | Chcecie uzyskać |
---|---|
|
|
Pewnie jest wiele sposobów na wykonanie tego zadania, ale jeżeli akurat żaden z nich nie przychodzi Wam do głowy, to może któryś z poniższych Was poratuje.
Tekst jest napisany pobieżnie bardziej jako wskazówka, niż dokładny instruktaż.
Mawia się, że potrzeba matką wynalazków, tak więc potrzebą moją było znalezienie na dysku pewnego pliku o określonej sumie kontrolnej. Pewnie są do tego narzędzia, pewnie nawet za darmo, ale jakoś tak bardzo nie chciało mi się szukać po Internecie, że napisałem sobie jednolinijkowca w PowerShellu.
Wygląda jak poniżej:
Get-Childitem -File -Recurse -LiteralPath "c:\Windows\System32" -Force -ErrorAction SilentlyContinue | ForEach {if ((get-filehash -path $_.FullName -Algorithm MD5 -ErrorAction SilentlyContinue).Hash -eq "5DA8C98136D98DFEC4716EDD79C7145F") {Write-Host "This file has searched control sum:" $_.FullName}}
Miejsca zaznaczone na czerwono można dopasować do własnych potrzeb, czyli:
Gdy otrzymacie plik zawierający adresy IP z portami, które chcecie usunąć (np. 123.123.123.123:80), wystarczy użyć do tego poniższej komendy powershella:
Get-Content plik_zrodlowy.txt | ForEach-Object {$_ -replace ":\d+$","" } | out-file plik_wyjsciowy.txt
Wynikiem będzie plik wyjściowy zawierający wyłącznie adresy IP, już bez numerów portów.
W celu wylistowania zainstalowanych dysków twardych oraz pendrajwów można użyć poniższej komendy Powershella:
Get-CimInstance -class Win32_DiskDrive -property * | select-object InterfaceType, Model, @{Name="Pojemnosc"; Expression={$_.Size / 1024MB}}, SerialNumber
Wynik powinien prezentować się jak poniżej:
Polecam uwadze pewną ciekawostkę. Można by sądzić, że na powyższej liście dyski twarde od pendrajwów można odróżnić po użytym interfejsie. W końcu widać tam 2 urządzenia z interfejsem USB, więc są to zapewne pendrajwy. Pozostałe zaś, to pewnie dyski twarde.
Tak nie jest. Pendrajwem jest także urządzenie Corsair Voyager GTX, które ma przypisany interfejs SCSI. Jest to pendrajw o pojemności aż pół terabajta (z jego testem możecie zapoznać się tutaj).
Piszę o tym ponieważ gdyby ktoś miał potrzebę wyfiltrowania powyższych wyników w celu wyświetlenia np. wyłącznie pendrajwów, to filtrowanie z użyciem interfejsu nie będzie tutaj najlepszym rozwiązaniem.
Wynik działania skryptu (wrażliwe dane zostały zamazane) |
Skrypt Get-ControlSumFromOpticalDrive otworzony w edytorze Visual Studio Code (prawda, że piękny? ;) |
-- Basic informations
Name: Back-UPS RS 500 FW:30.j5.I USB FW:j5
Chemistry: Lead Acid
-- measurements started
date time Availability BatteryStatus EstimatedChargeRemaining EstimatedRunTime
---- ---- ------------ ------------- ------------------------ ----------------
09.08.2019 20:58:40 2 2 98 203
09.08.2019 20:58:50 2 2 98 203
09.08.2019 20:59:00 2 2 98 203
09.08.2019 20:59:11 2 2 98 203
09.08.2019 20:59:21 2 2 98 203
09.08.2019 20:59:31 2 2 98 203
09.08.2019 20:59:41 2 2 98 203
-- Measurements completed
Dane logowane do pliku oddzielane są tabulatorami, dzięki czemu całość jest całkiem przyjemna w analizie, a ponadto umożliwia łatwą wizualizację w Excelu. Dziesięciominutowy okres ładowania akumulatora w zasilaczu APC Back-UPS RS500 zwizualizowany na wykresie |