Skocz do zawartości


tablety.pl

luck_skywalker

Rejestracja: 13 sie 2009
Poza forum Ostatnio: 13 08 2011 12:51
*----

Moje posty

W temacie: Skrypt PowerShell (kłopot ze skladnią)

17 08 2009 - 11:27

Ale co do formatowania zajrzyj tu String Formatting: klik, klik, klik, klik


Zwroc jednak uwage, ze w poprzedniej wersji skryptu mialem takie formatowanie:
$dir_g {0:#.00 GB} (bajtów: $size_g)" -f ($size_g/(1073741827))
Co jest tylko jednym z wariantow, ktore mi zaproponowales. Problemem glownym byly nawiasy klamrowe oraz przelacznik formatowania "-f" . Nie poradizlem sobie z wstawianiem tego do stringu. Kulawym obejsciem problemu bylo zastosowanie round(). Choc przez braki PS 1.0 wynik rozni sie od zakladanego (tego z konsoli). Ale najwazniejsze, ze dziala.

Dzieki za zainteresowanie.

P.S.
Sorry za brak polskich znakow, ale lokalizuje wlasnie nowa Opere.

W temacie: Skrypt PowerShell (kłopot ze skladnią)

17 08 2009 - 08:31

Zgodnie z obietnicą publikuję działający skrypt:

# g,av   - lista podkatalogow do wyszukiwania,
# f_g,f_av - pliki, 
# dir_g,dir_av - katalogi z plikami np. 'C:\Windows'
# dni - jak dlugo nie modyfikowane (istnieja) pliki
# size_all_g, size_all_av - wielkosc wszystkich plikow w katalogach
# y - zmienna pomocnicza (roznica dni liczona w petli)
 
# f_g.CreationTime, f_av.CreationTime <-- Czas utworzenia
# f_g.LastAccessTime, f_g.LastAccessTime <-- Czas ostatniej modyfikacji

$dir_g = '\Path\to\graphics\files\'
$dir_av =  '\Path\to\video\files\'

$g = Get-ChildItem -recurse $dir_g
$av = Get-ChildItem -recurse $dir_av

$size_g = 0
$size_av = 0
$size_all_g= 0
$size_all_av= 0
$dni = 30

foreach($f_g in $g){
	if ($f_g.PsISContainer -ne $True)
	{
		$all_f_g = $f_g | % {$size_all_g=$size_all_g+$_.Length}
		$y = ((Get-Date) - $f_g.LastAccessTime).Days	   #$y = ((Get-Date) - $f_g.CreationTime).Days
		if ($y -gt $dni -and $f_g.PsISContainer -ne $True)
		{
			$f_g | % {$size_g=$size_g+$_.Length} #{$f_g.Delete()}			
		}
	}
}

foreach($f_av in $av){
			 if ($f_av.PsISContainer -ne $True)
	{
		$all_f_av = $f_av | % {$size_all_av=$size_all_av+$_.Length}
		$y = ((Get-Date) - $f_av.LastAccessTime).Days	 # $y = ((Get-Date) - $f_av.CreationTime).Days
		if ($y -gt $dni -and $f_av.PsISContainer -ne $True)
		{
			$f_av | % {$size_av=$size_av+$_.Length}  #{$f_av.Delete()}
		}
	}
}

#Wyswietla na konsoli

"Nie używane przez ostatnie $dni dni"
"------------------------"
"$dir_g  $([math]::round($size_g/(1073741827))) GB (bajtów: $size_g)"
"$dir_av $([math]::round($size_av/(1073741827))) GB (bajtów: $size_av)"


"Wszystkie pliki na serwerze FTP" 
"------------------------"
"$dir_g  $([math]::round($size_all_g/(1073741827))) GB (bajtów: $size_all_g)"
"$dir_av $([math]::round($size_all_av/(1073741827))) GB (bajtów: $size_all_av)"


# Wysyla na e-mail

$emailFrom = "nobody@nowhere.com"
$emailTo = "destination@nowhere.com"
$subject = "Informacja o zajętości plików w określonych katalogach"

$body = "

Pliki nie używane przez ostatnie $dni dni
------------------------
$dir_g  $([math]::round($size_g/(1073741827))) GB (bajtów: $size_g)
$dir_av $([math]::round($size_av/(1073741827))) GB (bajtów: $size_av)


Wszystkie pliki na serwerze FTP 
------------------------
$dir_g  $([math]::round($size_all_g/(1073741827))) GB (bajtów: $size_all_g)
$dir_av $([math]::round($size_all_av/(1073741827))) GB (bajtów: $size_all_av)

Wiadomość wygenerowana automatycznie.

"

$smtpServer = "mail.server.com"
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$smtp.Send($emailFrom, $emailTo, $subject, $body)

# System.Net.Mail.Attachment  <-- zalacznik

Problem z formatowaniem obszedlem poprzez zastosowanie funkcji
[math]::(round $divide, $precision)
Co ciekawe w
$host

Name			 : ConsoleHost
Version		  : 1.0.0.0
nie działa niestety jedna z ważniejszych funkcji Round - ustalanie ilości liczb po przecinku :blink:

By usuwać pliki przy wyszukiwaniu należy w miejsce zliczania (tutaj pierwsza pętla dla plików f_g):
...
$f_g | % {$size_g=$size_g+$_.Length }
...
wstawić takie coś:
{$f_g.Delete()}
Ale to już zależy od Was. Ja bym jednak był ostrożny.
Wynikiem jest e-mail o treści:

Pliki nie używane przez ostatnie 30 dni
------------------------
\Path\to\graphics\files\ 7 GB (bajtów: 7816527185)
\Path\to\video\files\ 27 GB (bajtów: 28615721021)


Wszystkie pliki na serwerze FTP
------------------------
\Path\to\graphics\files\  30 GB (bajtów: 32217758774)
\Path\to\video\files\ 218 GB (bajtów: 234225053398)

Wiadomość wygenerowana automatycznie.

Pozdrawiam.

W temacie: Skrypt PowerShell (kłopot ze skladnią)

16 08 2009 - 20:51

Po pierwsze jak już pisałem tabela nie chce działać pod PS 1.0, tak jak Log-Flle, Out-File i wiele innych


Jak masz ustawioną politykę uruchaminia skryptów? Tak mi się coś w głowie kołacze. Ustawiałeś ją? Jesli nic nie robiłeś to jest automatyczna restrykcja uruchamiania skryptów, tylko nie wiem czy może mieć to związek w 1.0 co do uruchamiania innych poleceń, nie powinno mieć. Wklep:
Get-ExecutionPolicy
Jak będzie restricted to zmień na dostęp nieograniczony:
Set-ExecutionPolicy Unrestricted


Pierwsze co zrobiłem to zmieniłem politykę. Domyślnie było ustawienie uniemożliwiające wykonywanie skryptów Powershell'a.

Co do Log-File - może coś pomieszałem.
Jak już pisałem, cytuję wszystko z pamięci. Więc się mogłem machnąć. A biegły w PS nie jestem.

Resztę sprawdzę jutro rano.

W temacie: Skrypt PowerShell (kłopot ze skladnią)

14 08 2009 - 21:40

Ja Ciebie rozumiem i to że nie chcesz pokazać całego skryptu, zmienne które pokazujesz nie wiele mi mówią, a tylko dlatego że ja lubie obejrzeć całą zawartość tego co widzę.

Nie to, że nie chcę. Są wg mnie mało istotne. $dir0 pojawiło się tylko w testach, właściwe to $dir_g. Po prostu są to zmienne określające katalog ($dir_g) oraz listę plików ($f_g) wpisanych rekursywnie do zmiennej poprzez Get-ChildItem (alias DIR). $size_g i $size_all_g określają kolejno wielkość pliku graficznego oraz wielkość wszystkich plików w danym katalogu (tutaj to tylko grafika). Zmienną $size_all_g możemy również wykorzystać (dopisałem to przykładowo poniżej jako "Wszystkie pliki").
...
$dir_g = "C:\path\to\graphics\files" # Sciezka do katalogu z grafika
$f_g = Get-ChildItem $dir_g -recurse  # Lista plikow graficznych
$size_g = 0
$size_all_g = 0
...
I potem przetwarzane w pętli jak podałem. Wynik wyświetlony w konsoli, to ta część zaraz za pętlą:
"Nie używane przez ostatnie $dni dni"
"------------------------"
"$dir_g {0:#.00 GB} (bajtów: $size_g)" -f ($size_g/(1073741827))
"Wszystkie pliki"
"------------------------"
"$dir_g {0:#.00 GB} (bajtów: $size__all_g)" -f ($size__all_g/(1073741827))
Ta druga wartość (wcześniej $dir1, podana później jako $dir_av) to wynik innej pętli tj. na innej zmiennej. Po prostu sprawdzana jest w niej inna ścieżka. Mozna było to oczywiście zrobić w jednej pętli, lecz za bardzo by to zagmatwało sprawę. Dla testów formatowania, można przecież podstawić dwukrotnie tą samą zmienną.

$body = "Get-WmiObject WIN32_Process  | format-table * "
$body

Po pierwsze jak już pisałem tabela nie chce działać pod PS 1.0, tak jak Log-Flle, Out-File i wiele innych. Poza tym docelowo chcę to wysłać właśnie w ten sposób:
C:\Windows\   28,60 GB (bajtów: 30708227364)
C:\Program Files\ 195,11 GB (bajtów: 209493521858)
Sposób wyświetlenia nie zmieni problemu z zaokrąglaniem liczby z precyzją.
Bo kto chce oglądać wielkość katalogu np. w ten sposób:
C:\Windows\   28,5992653 GB (bajtów: 30708227364)
Jest to mało czytelne i niezbyt eleganckie. Szczególnie przy dużej ilości danych. W gąszczu cyfr trzeba znaleźć przecież przecinek.

Tak jak pisałem: wrócę do tego dopiero w poniedziałek. Jeśli coś wymyślę z rana: to dam znać, jak to rozwiązałem.
Na codzień posługuję się Pingwinem, więc nie mam nawet tego jak sprawdzić. A skrypt, to niestety wymóg pracy admina. Skrypty pisałem kiedyś pod DOS. Nie wiedziałem do zeszłego tygodnia, że jest coś takiego jak PowerShell. Uratował mi życie :blink: Bo o ile plikiem wsadowym można wylistować rekursywnie pliki w katalogu, to już sztuczek z datą utworzenia (modyfikacji) nie bardzo. No i to wysłanie pocztą.

Aha i oczywiście zapodam cały skrypt !!! Teraz mogłem zrobić to z błędami - pisałem z pamięci.

Pozdrawiam.

W temacie: Skrypt PowerShell (kłopot ze skladnią)

13 08 2009 - 17:08

Jak się w tym przypadku łączy łańcuchy? Może w ten sposób to przekażę do zmiennej $body?


Tu jest inna sytuacja ponieważ funkcja ma za zadanie przesłać już stworzony plik. Dalej posiada tylko parametry do kogo, gdzie.

Niekoniecznie. Pokazałem przecież, że w ten sposób funkcja $smtp.Send wysyła mail-a wraz ze zmiennymi. Problemem jest tylko formatowanie tej zmiennej w "locie" (przycięcie liczby do odpowiedniej precyzji tj. dwóch znaków po przecinku)

Co do wersjii konsoli by uzyskać jej wersję wystarczy wpisać: $host

Co do wersji konsoli jest to na pewno powershell v 1.0 . Sprawdziłem j/w.

Co do Get-Date to jest w .NET już przekonwertowana data normalnie w WMI odpowiada klasa CIM_DATETIME

Tak zgadza się, tylko w jaki sposób operować tą datą? Jaka metoda umożliwi nieskomplikowanie wyznaczenie pliku nie odczytywanego od x dni, tak jak to zrobiłem w tym skrypcie. W Powershellu wystarczy odjąć od siebie funkcje .Days metod Get-Date oraz LastAccesTime i wynik mamy gotowy.

Na początek dam Ci coś gotowego:

Sending E-mail From PowerShell v1.0
Sample for Sending Email with PowerShell (gotowiec do podstawienia dane).
Później zajmiemy się tym blisko, teraz jeszcze doprowadzam kilka rzeczy do porządku.

Widziałem mnóstwo podobnych. Nie wiem czy zauważyłeś, ale w każdym zmienna $body to jest coś takiego
$body = ""
U mnie występuje to tak samo. Jedyna różnica to problem z generowaniem pliku (bo trzeba go wywołać np. z pliku BAT co pod znakiem zapytania stawia zastosowanie PS) lub dołączeniem formatowania do zmiennej w pamięci, przygotowanej do wysłania. Sprawa załącznika nie zmieni faktu, że trzeba taki plik wygenerować.
Formatowanie w trybie tabel itp. to tylko inny sposób wyświetlenia. Problemem najistotniejszym jest tu zaokrąglenie liczby lub ilorazu liczb, do określonego miejsca po przecinku np {0:#.00}. Jak sprawić, by w string utworzony z tym ciągiem potraktował go jako funkcję formatującą a nie zwykły ciąg znaków?
Tabele, XML oraz HTML nie działają w PS 1.0. Oglądałem to tylko w PS2.0 u siebie w domu. Kod stworzony pod PS 2.0 jest nieprzenośny do wersji 1.0 . O czym, sam się przekonałem.
Sam skrypt wysyła maile wyśmienicie, choć to mój pierwszy w PowerShell. Nie trułbym na forum, gdyby nie potrzeba. Od poniedziałku muszę wysyłać raporty co do zajętości różnych katalogów ftp. Ma to być co tydzień. By odciążyć pamięć, zrobiłem skrypty oraz wpisy w Harmonogramie. Niestety skrypty wysyłają pocztę nie tak jak bym chciał. A pamięć czasami bywa zawodna.

P.S.
Wrócę do tematu w poniedziałek. Bo dostęp do tego serwera mam tylko z wewnątrz. Może coś do tego czasu wymyślę.