Windows Powershell skripti tiedostojen siirtämiseksi haluamalleen levylle

Näin sosiaalisen eristäytymisen aikoina pitää keksiä itselle puuhaa. Tai no oikeastaan ei erikseen tarvitsisi (koska sitä kyllä riittää muutenkin), mutta tämä idea kuitenkin syntyi turhautumisesta. Ajattelin, että tästä voisi olla hyötyä muillekin joten päätin kirjoittaa pienen ohjeistuksen aiheesta.

Kyllästyin siis tallentamaan netistä kuvia niin, että lataan ne ensin selaimen lataus-kansioon ja sieltä käsin siirrän omaan eri kansioonsa ja vieläpä eri levylle. Tähän olisi internetissä tarjolla erilaisia asennettavia softia, mutta niistä ei koskaan tiedä mitä koodia ne koneessa suorittavat.

Pari tuntia googletusta kuinka Powershellillä skriptaillaan ja nyt tietokone tekee tämän puolestani, heti kun olen jotain tallentanut (tarkemmin sanottuna 5 sekuntia latauksesta). Vaati hieman kikkailua, koska kohdelevyt ovat eri asemia ja Chrome ei turvasyistä anna lisäosien suoraan tallentaa eri levylle.

Mutta miten tämä oikein tapahtuu? Tässä ohje, jos haluat tämän ominaisuuden itsellesikin toteuttaa (ei vaadi ohjelmien asentelua, vain Chrome-selaimen ja 1-lisäosa). Ohje voi vaikuttaa monimutkaiselta, mutta on oikeastaan aika nopeasti tehty. Laita palautetta jos koet ohjeet puutteelliseksi.

Save Image Router asetukset

Aluksi asennetaan Chrome-selaimeen lisäosa Save Image Router, minkä avulla saadaan hiiren toiselle napille valikkoon valinta, mistä voidaan valita kohdekansio. Kohdekansio tulee automaattisesti (ellei jo ole olemassa) Chromen latauskansioon, eli alikansioksi.

Kun lisäosa on asennettu, sen asetukset kannattaa säätää kuntoon. Avaa toimintavalikko Chromen oikeasta yläkulmasta kolmen pisteen luota ja sieltä laajennusten asetukset:

Chrome laajennusten asetukset valikkoon pääset näin.

Klikataan auki tiedot ja laajennosasetukset:

Laajennusasetukset

Valitse "title"-kohtaan valikon nimi joka näkyy hiiren toisella napilla, "directory"-kohtaan kansion nimi, joka tulee olemaan tai on jo olemassa selaimen latauskansiossa ja toiminto "if exists" kohtaan mikäli kansiossa on jo samanniminen tiedosto, tällä ei kuitenkaan lopulta ole väliä kuten tulet lopussa huomaamaan. "Show default location..." täpän voi myös ottaa pois päältä jolloin valikossa näkyy ainoastaan itse määritetyt sijainnit.

Kansion ja valikon asetukset

Testaa tallentamalla jokin kuva niin lataukset-kansioosi pitäisi ilmestyä annetun nimen mukainen kansio, esimerkiksi kuvassa yllä on nimenä "siirto" ja myöhemmin lisäsin öökkösten testaamiseksi kansion "työt". Tallenna esim. jokin kuva kansioon.

Lisäosan testaus

Nyt kansiossa pitäisi olla kuva. Tässä tapauksessa kuvan kuva:

Kuva ladattu kansioon lisäosan avulla

Lisäosan toiminnan testaamisen jälkeen voidaan siirtyä skriptaamiseen.

Powershell skripti tiedostojen siirtämiseksi haluttuun kansioon

Powershell on komentorivimäinen työkalu, mutta jonkun verran voimallisempi toiminnoiltaan kuin perinteinen komentorivi (cmd). Sitä käytetään ilmeisen paljon ainakin IT-puolella, ajelemaan erilaisia konffauksia yms, mutta voi sitä käyttää kotikoneellakin "pukin pikku apurina" vaikkapa.

Tämä alla oleva skripti tekee muutaman asian:

  1. Ensin skripti luo "vahtikoiran" haluttuun kohdekansioon
  2. Kun kohdekansiossa tapahtuu muutoksia, skripti aktivoituu...
  3. ...ja tiedosto siirretään haluttuun paikkaan.
  4. Skripti kirjoittaa

Tämän skriptin alkuperäinen idea on kotoisin täältä: https://superuser.com/questions/226828/how-to-monitor-a-folder-and-trigger-a-command-line-action-when-a-file-is-created. Tämä on aikalailla vain kopio yllä olevan linkin koodista omin muutoksin tietty. Alla käyn läpi skriptin luomisen vaiheet.

Vaihe 1: Luo uusi tiedosto notepadilla tai millä vaan (nimi voi olla mikä tahansa, mutta tässä olen käyttänyt tätä) nimeltä watch-and-move.ps1. Tallenna tiedosto paikkaan mistä aiot sen komentorivillä suorittaa. Esim "C:\Omat" jne... Paikalla ei ole merkitystä.

Vaihe 2: Liitä tiedostoon alla olevat koodit ja muuta merkityt kohdat vastaamaan lähde- ja kohdekansioita. Ylin alleviivattu on lähdekansio mistä siirto tapahtuu, eli siis edellä mainitun lisäosan kansio Chromen latauskansiossa:

### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO
    $watcher = New-Object System.IO.FileSystemWatcher
    $watcher.Path = "C:\Users\PellePeloton\Downloads\siirto"
    $watcher.Filter = "*.*"
    $watcher.IncludeSubdirectories = $false
    $watcher.EnableRaisingEvents = $true

### DEFINE ACTIONS AFTER AN EVENT IS DETECTED
    $action = { 
                $fname = $Event.SourceEventArgs.Name
                sleep 5
                $path = $Event.SourceEventArgs.FullPath
                $changeType = $Event.SourceEventArgs.ChangeType
                $logline = "$(Get-Date), $changeType, $path"
                Add-content "C:\Users\PellePeloton\Downloads\watcher-log.txt" -value "File $path Created!"
                Move-Item -Path $path -Destination D:\Siirretyt
              }

### DECIDE WHICH EVENTS SHOULD BE WATCHED 
    Register-ObjectEvent $watcher "Renamed" -Action $action
    while ($true) {sleep 1}    

Tee muutokset ja tallenna tiedosto. Skripti on nyt valmis. Kertauksena vielä, että:

  • Keltainen on lähdekansio eli Chromen latauskansio
  • Vihreä on se kansio, mihin haluat lokitiedoston tapahtumista syntyvän
  • Oranssi on kohdekansio, mihin ladattu tiedosto siirretään

Tarkemmin skriptin eri toiminnoista voit lukea esim. näistä linkeistä:

http://dereknewton.com/2011/05/monitoring-file-system-changes-with-powershell/
https://docs.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher?redirectedfrom=MSDN&view=netframework-4.8
https://docs.microsoft.com/fi-fi/powershell/module/Microsoft.PowerShell.Utility/Register-ObjectEvent?view=powershell-5.1

Skriptin toimintalupien tarkistus

Oletuksena skriptiä ei varmaankaan pysty suorittamaan, joten tarvitaan myöntää sille lupa.

  1. Avaa Powershell:
Avaa Windowsin Powershell
  1. Suorita komento Get-ExecutionPolicy (vinkki: kirjoita ensimmäiset alkukirjaimet ja paina tabulaattoria, komentorivi ehdottaa löytyviä komentoja)
Skriptien ajo ei ole sallittu = Restricted

Mikäli käyttöoikeuksien muuttaminen arveluttaa, niin älä huoli, tässä muutetaan skriptien oikeuksia vain niin että se kohdistuu kyseisen käyttäjän itse luomiin tai muuten allekirjoitettuihin ja luotettuihin skripteihin. Lue lisää käyttöoikeuksista täältä: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/set-executionpolicy?view=powershell-7

  1. Muutetaan käyttöoikeudet sallimaan skriptin ajo ja varmistetaan muutokset. Kirjoitetaan komennot [hakasuluissa enterin painallus]:
    Set-ExecutionPolicy -Scope CurrentUser [enter]
    RemoteSigned [enter]
    A [enter]
    Get-ExecutionPolicy [enter]
Käyttöoikeudet skriptin ajamiseen sallittu
  1. Suunnista kansioon, mihin skripti on tallennettu ja kokeile ajaa se. Jos näkyviin tulee alla olevan kuvan mukaisia herjoja, niin käyttöoikeuksia ei ole muutettu.

    Toinen herja mitä voi tulla, on se että jos kansioita ei ole luotu Chromen latauskansioon. Tämä korjautuu kun luot kansiot tai lataat hiiren valikolla materiaalia jokaiseen kansioon (lisäosa luo kansion silloin). Parempi tapa on kuitenkin luoda kansiot ensin, ennen kuin lataa mitään.
Powershell ilmoittaa, että lupia skriptin ajamiseen ei ole

Jos kaikki meni putkeen, niin skriptin voi nyt ajaa ongelmitta. Alla olevan kuvan mukainen rivi ilmestyy PS-ikkunaan:

Skriptin voi suorittaa myös ilman komentoriviä, hiiren toisella napilla:

Tarkkailija-siirtäjä-skriptin suoritus ilman komentoriviä

Skriptin ajon voi lopettaa tehtävien hallinnasta tai painamalla näppäinyhdistelmää CTRL + C.

Periaatteessa muuta ei tarvita, ellei halua piilottaa toiminnallisuutta hieman enemmän pinnan alle, pois näkyvistä. Siitä lisää seuraavassa.

Skriptin ajo taustalla ja toiminnan tarkistus

Taustalla auki oleva ikkuna ei tietenkään hyvä ole, sillä hyödyllisen ominaisuuden saattaa vahingossa sulkea. Senpä vuoksi tehdään uusi tehtävä Windowsille ajettavaksi kun tietokone käynnistetään. Näin skriptiä ei tarvitse käsin käynnistää erikseen.

Tarkemmat ohjeet ajoitetun tehtävän (Task Scheduler) tekemiseen löytyy linkistä: https://community.spiceworks.com/how_to/17736-run-powershell-scripts-from-task-scheduler , mutta käydään sekin lyhyesti läpi.

Aloitetaan luomalla uusi ajoitettu tehtävä:

Task Schedulerista uusi tehtävä

General-välilehdellä annetaan tehtävälle nimi ja kuvaus. Nimi ei tule näkyviin tehtävienhallintaan vaan on nimenä ajoitetuissa tehtävissä.

Taskin nimi ja kuvaus. Tämän tietokoneen nimi peitetty.

Triggers-välilehdellä asetetaan seuraavat asetukset:

  1. Triggers välilehti
  2. Uusi...
  3. Taskin alku
  4. Mille käyttäjälle taski suoritetaan
  5. Skripti sallitaan
  6. OK
Triggerin asetus, eli milloin skripti potkaistaan käyntiin.

Action välilehdellä asetetaan loput asetukset.

Lopuksi skripti voidaan tallettaa OK napeilla ja suorittaa se käsin:

Skriptin suorittaminen käsin.

Tarkistus, että skripti todella toimii ja on taustalla, tehdään "Task Manager" ikkunasta eli tehtävien hallinnasta.

Tehtävienhallinnasta voidaan taustasuoritus tarkistaa

Kun nyt Chromesta tallennetaan jotain määriteltyyn kansioon, niin talletetun tiedoston pitäisi n. 5 sekunnin kuluessa siirtyä skriptissä määriteltyyn paikkaan.

Jos haluaa "vahdin" tehdä useammalle kansiolle (eikä osaa kauheasti koodia muutella), niin helpointa lienee kopioida ja uudelleen nimetä skriptitiedosto, vaihtaa koodeihin kansioiden sijainnit ja luoda uusi ajastettu taski samoilla asetuksilla.

Loppuhifistelyt

Mikäli vielä haluaa eroon Chromen ärsyttävästä "lataus valmis" alapalkista, alla olevan kuvan nimisellä "Always Clear Downloads in Chrome" lisäosalla sen saa hävitettyä. Klikkaa tiedot, laajennusasetukset ja "Disable download shelf".

Klikkaa tiedot, laajennusasetukset ja "Disable download shelf"

Siitäpä sitten latailemaan internettiä tyhjäksi...

Disclaimer eli vastuuvapauslauseke

Tiedän, että tämä ei varmaankaan ole tehokkain tapa tehdä tällainen toiminnallisuus. Esimerkiksi C#:lla tai muulla ohjelmointikielellä tämän saman asian pystyisi tekemään myös. Tässä minulla tarkoituksena oli vain tehdä skripti Windowsin omilla työkaluilla, ilman mitään lisäasennuksia (pl. Chromen lisäosat).

Jätä kommentti

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *

This site uses Akismet to reduce spam. Learn how your comment data is processed.