Χρήση του PowerShell για οικιακούς χρήστες - Ένας οδηγός για αρχάριους

Ποιος δεν εύχεται να μπορούσε να γίνει μάγος και να πει λίγα λόγια για να συμβούν μαγικά πράγματα; Λοιπόν(Well) , δεν είμαστε σε θέση να σας δείξουμε πώς να γίνετε μάγος, αλλά μπορούμε να σας δείξουμε πώς να κάνετε λίγη μαγεία στον υπολογιστή.

Εάν έχετε υπολογιστή με Windows με Windows 7(Windows 7) , έχετε το PowerShell . Επίσης, εάν έχετε υπολογιστή με Windows 7 , ενημερώστε τον για λόγους ασφαλείας.

Αλλά αυτό το άρθρο δεν είναι μόνο για άτομα με Windows . Η πιο πρόσφατη έκδοση του PowerShell είναι δωρεάν και μπορεί να εγκατασταθεί και να χρησιμοποιηθεί σε υπολογιστές Mac και Linux .

Αυτό είναι σημαντικό γιατί όσα μαθαίνετε για το PowerShell μπορούν να χρησιμοποιηθούν σε σχεδόν οποιονδήποτε υπολογιστή τώρα. Ποιός ξέρει? Μπορείτε να ανεβάσετε αυτήν την ικανότητα στο επόμενο επίπεδο και να ξεκινήσετε μια καριέρα στην Πληροφορική(Information Technology) .

Τι είναι το PowerShell;

Η απάντηση υψηλής τεχνολογίας από τη Microsoft(Microsoft) είναι ότι πρόκειται για ένα κέλυφος γραμμής εντολών που έχει σχεδιαστεί ειδικά για διαχειριστές συστήματος. †Ακούγεται(” Sounds) τρομακτικό. Αλλά δεν είναι. Φροντίζεις τον υπολογιστή σου; Ναι, τότε είστε ο διαχειριστής του συστήματος στο σπίτι σας.

Λέτε στον υπολογιστή σας τι να κάνει με τα κλικ και τα πλήκτρα; Ναι, σκεφτείτε λοιπόν το κέλυφος της γραμμής εντολών ως απλώς ένα άλλο παράθυρο στο οποίο πληκτρολογείτε πράγματα για να πείτε στον υπολογιστή σας τι να κάνει. Μπορείτε να το κάνετε αυτό.

Το PowerShell(PowerShell) είναι σαν μια γλώσσα προγραμματισμού, αλλά όχι τόσο κρυπτική όσο οι περισσότερες. Διαβάζει πραγματικά πολύ σαν τα κανονικά Αγγλικά(English) , κάτι για το οποίο η Microsoft προσπάθησε ώστε να μπορεί να το συλλάβουν και μη προγραμματιστές.

Είναι ένας τρόπος να γράψετε μερικές γραμμές εντολών, που ονομάζονται σενάριο, για να κάνετε το λειτουργικό σύστημα Windows να κάνει κάτι που θέλετε να κάνει. Στη συνέχεια, μπορείτε να αποθηκεύσετε αυτές τις γραμμές σε ένα αρχείο και να το εκτελέσετε με ένα κλικ ή να προγραμματίσετε να εκτελείται περιοδικά.

Τι μπορείτε να κάνετε με το PowerShell;

Το σημείο υψηλού επιπέδου του PowerShell είναι να μπορεί να αυτοματοποιεί εργασίες, ώστε να μην χρειάζεται να σπαταλάτε το χρόνο σας κάνοντας επανειλημμένα κοσμικά πράγματα. Για έναν επαγγελματία Διαχειριστή Συστημάτων(Systems Administrator) , αυτό θα μπορούσε να είναι κάτι σαν να δημιουργεί νέους χρήστες, να δημιουργεί κωδικούς πρόσβασης για αυτούς και να στέλνει ένα e-mail με τα στοιχεία στον νέο προϊστάμενό του.

Η διαδικασία που γίνεται χειροκίνητα, με κλικ και πληκτρολόγηση, μπορεί να διαρκέσει από 5 λεπτά έως και μία ώρα ή περισσότερο. Με τα σωστά σενάρια, ο Διαχειριστής Συστημάτων(Systems Administrator) μπορεί να μην χρειάζεται καν να κάνει κάποιο μέρος αυτού.

Αλλά θέλετε να μάθετε τι μπορείτε να κάνετε με το PowerShell στο σπίτι. Σχεδόν οτιδήποτε δεν σας αρέσει να κάνετε ξανά και ξανά. Χρησιμοποιήστε το για να ελευθερώσετε χώρο στον σκληρό σας δίσκο διαγράφοντας προσωρινά αρχεία και αρχεία καταγραφής που δεν χρειάζεστε.

Βάλτε απαγόρευση κυκλοφορίας στον υπολογιστή του παιδιού σας. Μετονομάστε(Rename) ή οργανώστε μια δέσμη αρχείων. Αυτή είναι η ομορφιά του PowerShell . Σχεδόν(Almost) οτιδήποτε μπορείτε να κάνετε στον υπολογιστή σας, μπορείτε να δημιουργήσετε ένα σενάριο PowerShell για αυτοματοποίηση και εκτέλεση με ένα κλικ ή με ένα χρονοδιάγραμμα.

Πώς μπορώ να χρησιμοποιήσω το PowerShell;

Ο ευκολότερος τρόπος για να εργαστείτε με το PowerShell είναι το Ενσωματωμένο Περιβάλλον Σεναρίων PowerShell (ISE)(PowerShell Integrated Scripting Environment (ISE)) . Μπορείτε να το βρείτε κάνοντας κλικ στο Έναρξη(Start) και πληκτρολογώντας powershell ise στη γραμμή αναζήτησης στα Windows 10 . Θα πρέπει να το δείτε όπως φαίνεται παρακάτω.

Για πρώτη φορά που το χρησιμοποιούμε, θα το τρέξουμε ως Διαχειριστής(Administrator) . Για να το κάνετε αυτό, πρέπει πρώτα να έχετε δικαιώματα διαχειριστή στον υπολογιστή σας. Στο μενού Έναρξη(Start Menu) , κάντε δεξί κλικ στο PowerShell ISE και, στη συνέχεια, κάντε κλικ στο Εκτέλεση ως διαχειριστής(Run as Administrator) .

Ενδέχεται να λάβετε ένα αναδυόμενο παράθυρο προειδοποίησης Ελέγχου πρόσβασης χρήστη(User Access Control) ( UAC ) που θα σας ρωτά εάν είστε βέβαιοι ότι θέλετε να το κάνετε αυτό. Κάντε κλικ στο Ναι(Yes) .

Τώρα κοιτάτε το PowerShell IDE . Το επάνω τμήμα του παραθύρου (1) είναι το παράθυρο δέσμης ενεργειών. Εδώ θα γράψετε το σενάριό σας. Το κάτω τμήμα του παραθύρου (2) είναι η περιοχή της κονσόλας. Όταν δοκιμάζετε το σενάριό σας, θα δείτε την έξοδο σε αυτό το παράθυρο.

Εδώ θα δείτε επίσης μηνύματα λάθους και τέτοια που θα σας βοηθήσουν να διορθώσετε και να βελτιώσετε τα σενάρια σας. Το παράθυρο στη δεξιά πλευρά του παραθύρου (3) είναι το πρόσθετο εντολών. Σκεφτείτε το ως ένα λεξικό όλων των εντολών του PowerShell που έχετε στη διάθεσή σας.

Το PowerShell(PowerShell) έχει ρυθμιστεί να μην εκτελεί κανένα σενάριο εκτός από αυτά που είναι ήδη μέρος των Windows . Θα χρειαστεί να το αλλάξετε, ώστε να μπορείτε να εκτελέσετε τα δικά σας σενάρια.

Στο παράθυρο δέσμης ενεργειών, αντιγράψτε και επικολλήστε τα εξής:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

Το τμήμα Set-ExecutionPolicy του ονομάζεται cmdlet (προφέρεται εντολές). Τα Cmdlet είναι ισχυρά πράγματα. Σκεφτείτε(Think) τις ως σύντομες εντολές που μπορείτε να δώσετε στα Windows(Windows) και τα Windows(Windows) θα κάνουν ένα σωρό πιο περίπλοκα πράγματα για να ικανοποιήσουν την εντολή σας.

Μια αναλογία θα ήταν να λέτε στο παιδί σας να καθαρίσει το δωμάτιό του. Σύντομο(Short) και επί της ουσίας. Εάν το παιδί σας γνωρίζει καλά τον καθαρισμό του δωματίου, τότε θα πάει να στρώσει το κρεβάτι του, να βάλει τα ρούχα του στο καλάθι, να βάλει τα παιχνίδια και τα βιβλία του στα ράφια και ίσως ακόμη και να καθαρίσει το πάτωμα με ηλεκτρική σκούπα. Καταλαβαίνουν ότι το cmdlet Clean-YourRoom σήμαινε όλα αυτά.

Στην κορυφή του παραθύρου, θα δείτε μια πράσινη αιχμή βέλους. Κάντε κλικ(Click) σε αυτό για να εκτελέσετε την εντολή.

Το τμήμα -ExecutionPolicy λέει στο Set-ExecutionPolicy(Set-ExecutionPolicy) ποια πολιτική να ορίσει. Είναι μια παράμετρος. Λέει, «Θέλω να εργαστείτε σύμφωνα με αυτές τις οδηγίες και να κάνετε συγκεκριμένα αυτό. Του λέει να χρησιμοποιήσει τη συγκεκριμένη πολιτική του RemoteSigned .

Η πολιτική RemoteSigned δηλώνει ότι το PowerShell δεν μπορεί να εκτελέσει ή να εκτελέσει οποιοδήποτε σενάριο που λήφθηκε από το Διαδίκτυο(Internet) , εκτός εάν έχει υπογραφεί από αξιόπιστο εκδότη.

Με κυκλικό τρόπο, λέει στο PowerShell ότι είναι εντάξει να εκτελείται οποιοδήποτε σενάριο που έχει δημιουργηθεί τοπικά, επειδή δεν χρειάζεται να υπογραφεί από έναν απομακρυσμένο αξιόπιστο εκδότη. Τώρα, το σενάριο PowerShell θα μπορεί να εκτελέσει οποιοδήποτε σενάριο γράφετε στον υπολογιστή σας.

Ας δούμε ένα σενάριο για τη διαγραφή προσωρινών αρχείων. Δεν είναι τόσο ισχυρό ή ολοκληρωμένο όσο το CCleaner , αλλά το CCleaner έχει το δικό του σύνολο προβλημάτων.

Χρησιμοποιήστε το PowerShell(Use PowerShell) για να δημιουργήσετε χώρο(Create Space) στον σκληρό σας δίσκο(Your Hard Drive)

Θα αναλύσουμε αυτό το σενάριο, γραμμή προς γραμμή, ώστε να μπορείτε να δείτε πώς λειτουργεί. Στο τέλος, το σενάριο θα εμφανιστεί πλήρως, ώστε να μπορείτε να το αντιγράψετε και να το επικολλήσετε αν θέλετε.

$TempFileLocation = "C:\Users\username\Appdata\Local\Temp\*"

Οτιδήποτε έχει ένα σύμβολο δολαρίου μπροστά του είναι ένα όνομα μεταβλητής. Σκεφτείτε το σαν ένα πορτοφόλι για να τοποθετήσετε πολύτιμα πράγματα. Το πορτοφόλι(Wallet) μας θυμίζει το σύμβολο του δολαρίου, τα τιμαλφή ακούγονται σαν μεταβλητά, οπότε θα το θυμόμαστε και αυτό. Δημιουργούμε ένα πορτοφόλι ή μια μεταβλητή, με το όνομα $TempFileLocation . Το σύμβολο ίσου λέει στο PowerShell τι να βάλει σε αυτήν τη μεταβλητή.

Σε αυτήν την περίπτωση, τοποθετούμε τη θέση μιας θέσης προσωρινών αρχείων των Windows – C:\Users\username\AppData\Local\Temp\* . Το κάνουμε αυτό για δύο λόγους. Είναι μια τοποθεσία από την οποία είναι πάντα ασφαλής η διαγραφή αρχείων και θα τη χρησιμοποιήσουμε για να πούμε στο PowerShell πού πρέπει να πάει για να διαγράψει αρχεία.

Όπου λέει όνομα χρήστη σε αυτήν τη θέση, αλλάξτε το με το όνομα χρήστη σας. Αυτό είναι το όνομα χρήστη που χρησιμοποιείτε για να συνδεθείτε στον υπολογιστή σας. Ο αστερίσκος (*) στο τέλος του είναι μπαλαντέρ. Αυτό που αντιπροσωπεύει είναι τα πάντα στο φάκελο Temp , γιατί όλα στον φάκελο Temp είναι προσωρινά και θέλουμε να τα διαγράψουμε.

Τα διπλά εισαγωγικά γύρω από την τοποθεσία είναι επίσης σημαντικά. Αυτό λέει στο PowerShell ότι αυτό που υπάρχει εκεί είναι μια συμβολοσειρά. Σκεφτείτε(Think) τη συμβολοσειρά ως μια σειρά από γράμματα και χαρακτήρες. Αν ήταν συνηθισμένοι αριθμοί, δεν θα χρησιμοποιούσαμε τα εισαγωγικά.

$TempFile = Get-ChildItem $TempFileLocation -Recurse

Κάνουμε μια άλλη μεταβλητή. Αυτή τη φορά θα χρησιμοποιήσουμε μια εντολή για να βρούμε κάτι για να βάλουμε στη μεταβλητή $TempFile .

Get-ChildItem 

Ένα άλλο πράγμα που θα παρατηρήσετε σχετικά με τα cmdlet όπως το Get-ChildItem( Get-ChildItem) είναι ότι είναι πλήρως αναγνώσιμο. Δείτε πώς η πρώτη λέξη είναι ρήμα; Όλα τα Cmdlet(Cmdlets) ξεκινούν με λέξεις δράσης, ώστε να γνωρίζετε αμέσως τι κάνει. Το ChildItem(ChildItem) είναι δύο ουσιαστικά.

Το δεύτερο μέρος του cmdlet θα μας λέει πάντα σε ποιον τρόπο θα εφαρμόσει την ενέργεια το PowerShell . ChildItem σημαίνει όλα τα παιδιά μιας γονικής τοποθεσίας. Αυτό είναι σαν να λέμε λάβετε όλα τα αρχεία που βρίσκονται σε έναν φάκελο, με τα αρχεία να είναι τα παιδιά και ο φάκελος να είναι ο γονέας.

Τι είναι το cmdlet που παίρνει τα θυγατρικά αντικείμενα; Τα πάντα στη μεταβλητή $TempFileLocation . Το PowerShell(PowerShell) πρόκειται να μεταβεί στη θέση που τοποθετήσαμε νωρίτερα στο $ TempFileLocation και να λάβει όλα τα θυγατρικά στοιχεία που υπάρχουν εκεί. Στη συνέχεια, θα τα τοποθετήσει στη μεταβλητή $TempFile .

Λοιπόν, τι συμβαίνει με το μέρος -Recurse ; Αυτό λέει στο Get-ChildItem(Get-ChildItem) να εξετάσει τα πάντα σε αυτήν την τοποθεσία. Μην πάτε να λάβετε τα αρχεία αμέσως μέσα στον γονικό φάκελο. Εάν υπάρχουν φάκελοι σε αυτόν τον φάκελο, λάβετε επίσης όλα τα παιδιά τους, καθώς και τα παιδιά τους και ούτω καθεξής. Θα τα πάρουμε όλα.

$TempFileCount = ($TempFile).count

Ναι, δημιουργούμε μια τρίτη μεταβλητή που ονομάζεται $TempFileCount και θα βάλουμε έναν αριθμό σε αυτήν τη μεταβλητή. Πού είναι ο αριθμός; Λοιπόν, ( $TempFile).count θα μας πάρει αυτόν τον αριθμό. Πιθανότατα έχετε καταλάβει ότι το τμήμα .count θα κάνει την καταμέτρηση όλων των αρχείων που μόλις αποθηκεύσαμε στο $ TempFile .

Γιατί το κάναμε αυτό; Κυρίως επειδή είναι ωραίο να γνωρίζουμε πόσα άχρηστα αρχεία καθαρίζουμε με το υπόλοιπο σενάριο, ώστε να μπορούμε να πούμε πόσο αποτελεσματικό ήταν.

if($TempFileCount -eq 0)

Τώρα ρυθμίζουμε μια δήλωση υπό όρους. Μπορείτε να δείτε ότι ρωτά "εάν". Αν τι; Αν το πράγμα στις αγκύλες είναι αληθές ή ψευδές. Οι αγκύλες είναι σημαντικές, διαφορετικά το If δεν ξέρει τι να συγκρίνει. Εδώ, ρωτάμε αν ο αριθμός που αποθηκεύσαμε στο $TempFileCount είναι ίσος με μηδέν.

Το -eq είναι η συντομογραφία για ίσους. Είναι ένας τύπος τελεστή σύγκρισης. Είναι σαν να λέτε στα παιδιά σας: "Αν το δωμάτιό σας είναι καθαρό, υπέροχο, θα κάνουμε κάτι" Αυτή η δήλωση λέει εάν ο αριθμός που ήταν αποθηκευμένος στο $ TempFileCount είναι -ίσος με μηδέν κάντε το επόμενο πράγμα.

{Write-Host "There are no files in the folder $TempFileLocation" -ForegroundColor Green}

Αυτό είναι το πράγμα που θα συμβεί εάν $TempFileCount είναι μηδέν. Τα σγουρά στηρίγματα είναι σημαντικά. Λένε στο PowerShell να κάνει μόνο ό,τι είναι μέσα του, εάν το $ TempFileCount ισούται με μηδέν.

Θα γράψει στον κεντρικό υπολογιστή ή στην οθόνη, "Δεν υπάρχουν αρχεία στο φάκελο C:\Users\username\Appdata\Local\Temp\*". Η παράμετρος στο τέλος, – ForegroundColor λέει στο PowerShell να κάνει το κείμενο πράσινο. Αυτό απλώς διευκολύνει τη διάκριση από ένα μήνυμα σφάλματος που είναι συνήθως κόκκινο.

Else

Ξέρεις τι άλλο σημαίνει. Αυτό είναι το "το δωμάτιό σας καλύτερα να είναι καθαρό ή αλλιώς" μέρος του ελέγχου εάν το παιδί σας καθάρισε το δωμάτιό του. Αυτό θα συμβεί εάν $TempFileCount δεν είναι μηδέν.

{$TempFile | Remove-Item -WhatIf -Confirm:$false -Recurse -Force -WarningAction SilentlyContinue -ErrorAction SilentlyContinue}

Αυτό λέει μεταβείτε στην τρέχουσα τοποθεσία που είναι αποθηκευμένη στο $TempFile . Η κατακόρυφη γραμμή μετά από αυτήν ονομάζεται σωλήνας. Λειτουργεί κάπως σαν ένας πραγματικός σωλήνας καθώς λέει στο PowerShell να διοχετεύσει τα περιεχόμενα του $ TempFile στο cmdlet, σαν να διοχετευόταν νερό σε ένα πλυντήριο ρούχων. Στη συνέχεια, το cmdlet Remove-Item κάνει αυτό που λέει. αφαιρεί οτιδήποτε βρίσκεται σε αυτή τη θέση.

Η παράμετρος -WhatIf είναι πολύ σημαντική σε αυτό το στάδιο. Λέει στο PowerShell να εκτελέσει την εντολή, αλλά μόνο να την δοκιμάσει και να μην αφαιρέσει τίποτα. Απλώς(Just) δείξτε μας τι θα συνέβαινε αν το κάναμε πραγματικά αυτό.

Αυτό σας επιτρέπει να δοκιμάσετε εντολές χωρίς να αλλάξετε τίποτα στον υπολογιστή σας. Αφήστε το -WhatIf εκεί μέχρι να νιώσετε άνετα ότι το σενάριο θα κάνει αυτό που θέλετε και τίποτα άλλο. Στη συνέχεια, απλώς διαγράψτε το και το σενάριο θα κάνει τη δουλειά του.

Η παράμετρος -Confirm:$false εμποδίζει το σενάριο να ρωτά εάν θέλετε πραγματικά να διαγράψετε το αρχείο. Ξέρεις τι κάνει το -Recurse . -Δύναμη( -Force) σημαίνει διαγραφή αυτού του πράγματος ό,τι κι αν γίνει. -Το WarningAction(-WarningAction ) έχει οριστεί σε SilentlyContinue .

Αυτό εμποδίζει το σενάριο να σας δώσει προειδοποιήσεις σχετικά με αυτό που διαγράφετε. -Το ErrorAction(-ErrorAction) έχει οριστεί σε SilentlyContinue , έτσι ώστε αν υπάρχει κάποιο είδος σφάλματος στη διαδικασία, απλώς συνεχίζει να τρέχει.

Τώρα είμαστε στην τελευταία γραμμή.

Write-Host "Cleared $TempFileCount files in the folder $TempFileLocation" -ForegroundColor Green}

Ακριβώς όπως έκανε το Write-Host την πρώτη φορά, θα βγει η ακόλουθη πρόταση, ώστε να ξέρουμε τι έχει συμβεί. Θα μας πει πόσα αρχεία διαγράφηκαν από τον φάκελο που μόλις επεξεργάστηκε και θα το κάνει με πράσινο χρώμα για να είναι εύκολο να εντοπιστεί.

Ας δούμε συνολικά το σενάριο:

$TempFileLocation = "C:\Users\guymcd\Appdata\Local\Temp\*"
$TempFile = Get-ChildItem $TempFileLocation -Recurse
$TempFileCount = ($TempFile).count

if($TempFileCount -eq "0") {
Write-Host "There are no files in the folder $TempFileLocation" - ForegroundColor Green
}
Else {
$TempFile | Remove-Item -Confirm:$false -Recurse -Force -WarningAction SilentlyContinue -ErrorAction SilentlyContinue
Write-Host "Cleared $TempFileCount files in the folder $TempFileLocation" -ForegroundColor Green
}

Μπορείτε να το αντιγράψετε και να το επικολλήσετε στο PowerShell ISE και να το αποθηκεύσετε ως κάτι σαν το delete-TemporaryFiles.ps1(delete-TemporaryFiles.ps1) . Μπορείτε επίσης να τηρήσετε τη σύμβαση ονομασίας των cmdlet τώρα που τα καταλαβαίνετε.

Εάν ο κώδικας δεν λειτουργεί για εσάς για κάποιο λόγο, μπορείτε επίσης να κάνετε λήψη του σεναρίου PowerShell που δημιουργήσαμε και απλώς να το εκτελέσετε. Απλώς(Just) αποσυμπιέστε το πρώτα για να δείτε το αρχείο σεναρίου.

Όποτε θέλετε να εκτελέσετε αυτό το σενάριο, απλώς κάντε δεξί κλικ πάνω του και επιλέξτε Εκτέλεση με PowerShell(Run with PowerShell) . Μια κονσόλα PowerShell θα εμφανιστεί για ένα ή δύο δευτερόλεπτα, ενώ το σενάριό σας κάνει τη δουλειά του και, στη συνέχεια, θα εξαφανιστεί εάν δεν υπάρχουν σφάλματα.

Πού μπορώ να μάθω περισσότερα PowerShell;

Φαίνεται πολύ! Για το πρώτο σας σενάριο PowerShell είναι λίγο. Εάν τα καταφέρατε ως εδώ, χειροκροτήστε τον εαυτό σας. Έχετε μάθει πολλά σήμερα, αλλά τώρα θέλετε να μάθετε περισσότερα. Αυτό είναι υπέροχο!

Υπάρχουν πολλοί πόροι στο Διαδίκτυο(Internet) για να μάθετε περισσότερα σχετικά με το PowerShell . Ένα καλό μέρος για να ξεκινήσετε είναι το άρθρο μας, « Δημιουργία λίστας προγραμμάτων εκκίνησης μέσω γραμμής εντολών ή PowerShell(Generate a List of Startup Programs via Command Line or PowerShell) » . Στη συνέχεια, ελέγξτε αυτούς τους άλλους πόρους:



About the author

Είμαι προγραμματιστής λογισμικού με πάνω από 10 χρόνια εμπειρία. Ειδικεύομαι στον προγραμματισμό Mac και έχω γράψει πολλές χιλιάδες γραμμές κώδικα για διάφορες εφαρμογές Mac, συμπεριλαμβανομένων, ενδεικτικά, των: TextEdit, GarageBand, iMovie και Inkscape. Έχω επίσης εμπειρία με ανάπτυξη Linux και Windows. Οι δεξιότητές μου ως προγραμματιστής μου επιτρέπουν να γράφω υψηλής ποιότητας, ολοκληρωμένα σεμινάρια για διάφορες πλατφόρμες ανάπτυξης λογισμικού - από macOS έως Linux - καθιστώντας τα σεμινάρια μου την τέλεια επιλογή για όσους θέλουν να μάθουν περισσότερα για τα εργαλεία που χρησιμοποιούν.



Related posts