Delving i Windows Powershell
Oprindeligt postet den 2019-03-11.
I løbet af mine open source-udgivelser befandt jeg mig tilbage til Flashpoint og kuratere for sjov.
Freearcade (som jeg nævnte i mit forrige indlæg) er et websted, der hovedsageligt har Java-applet-spil, og disse spil har en tendens til at have en masse aktiver.
Da jeg besluttede at sammenlægge et andet Java-applet-spil, indså jeg, at det ikke kun var Wiz3 med en masse aktiver, men også dette spil.
Flashpoint leveres med autokurator-scripts (som jeg ikke vidste på det tidspunkt), men jeg besluttede at lave min egen ved hjælp af Windows PowerShell. Jeg har ønsket at lære Powershell-scripting efter at have nydt bash, og besluttede, at jeg som en kæmper Windows-udvikler skulle lære kendskab til værktøjerne på denne platform. Så dette dilemma var en god undskyldning.
Så dette er mit første PowerShell-script.
Problem:
Gør HTTP GET-anmodninger på flere Flashpoint-omdirigator 404s.
Du kan kopiere alle 404 URL’er ved at trykke på ‘Værktøjer -> Kopiere alle 404 ikke fundne URL’er’. Det er kedeligt at gå til hver URL og downloade filer én efter én.
Opløsning:
Lav et PowerShell-script for at automatisere det.
Get-Assets.ps1
<# Et nyttigt powershell-script til at downloade filer fra webadresser #>
# $output = uanset hvilken mappeplacering du vil have scriptet til at gemme filerne på.
$output = "..\..\Flashpoint Core 2.3\Games\Flash\htdocs\ww2.freearcade.com\Jetslalom.jav\"
$client = new-object System.Net.WebClient
- Accepter placeringen af, hvor brugeren vil gemme aktiverne i
$output
(Dette ændres i øjeblikket manuelt i selve scriptet - har brug for det gennem brugergrænsefladen) $client
indstiller Webclient-objektet, der indeholder metoder til at sende data og modtage data fra URL’er
while($select -ne 0){
Write-Host "Vælg mellem følgende indstillinger:
1. Afslut script
2. Grib aktiv fra en URL
3. Grib flere aktiver fra flere webadresser "
$select = Read-Host -Prompt "Indtast dit valg"
- Linjen
while
linje løkker prompten, indtil brugeren afslutter scriptet, så du kan fortsætte med at gribe flere eller enkelt aktiver uden at genstarte. Write-Host
skriver til skærmen, ogRead-Host
læser brugerinput - i modsætning til at brugeWrite-Host
, du kan bruge-Prompt
i stedet. Men her ønskede jeg at vise alle mulighederne for scriptet.
switch($select){
1{
$url = Read-Host -Prompt "Indtast URL (med http inkluderet)"
$file = Split-Path $url -Leaf
$client.DownloadFile($url, $output + $file)
}
- Switch-erklæringen er forklarende for script-valg
- Hvis det er valg 1, skal du læse brugerinput og gemme det
- PowerShell henter ikke filer fra en URL-placering uden at vide filens navn forud. Men med et script er det umuligt at forudse, hvilket filnavn noget vil være. Så
Split-Path $url -Leaf
opdeler URL’en i dele,-Leaf
parameter, der henviser til det sidste afsnit af en URL (dvs. http://www.example.com/src/leaf.png, ville bare få fat i URL-adressen, leaf.png) - Derefter kan vi bruge
WebClient
-objektet bruge metodenDownloadFile
til at downloade fra URL’en og gemme den på $ outputstien plus bladdelen af den URL, vi udtrækkede, i dette tilfælde en aktivfil.
2{
$txt = Read-Host -Prompt "Indtast placering af inputfil med 404 URLS (hvis det er i samme bibliotek, er det .\ Syntaks"
foreach($line in Get-Content $txt){
$filename = Split-Path $line -leaf
$client.DownloadFile($line, $output + $filename)
}
}
}
- Ved flere webadresser beder vi brugeren om at placere de kopierede 404’er fra omdirigering i en txt-fil for nem behandling. De er divideret med en linjeskift (men det betyder ikke noget for PowerShell).
- Metoden
foreach
løber gennem filen ved hjælp af Get-Content cmdlet. I MS-dokumenter læses tekstfiler “en linje ad gangen og returnerer en samling objekter, der hver repræsenterer en indholdslinje”. Så vi kan med det sammeSplit-Path
‘igen for at få navnene på filerne og downloade hver linje (som er en URL).
# Linie 29 er valgfri, det er for at sikre, at spillet nulstilles for at køre de nye aktiver
Stop-Process -name "appletviewer" -ErrorAction SilentlyContinue
}
Stop-Process
-linje stopper appletviewer (som kører spillet), som en måde at tvinge testeren til at genstarte spillet. Omdirigerer (og spillet) opdaterer ikke det faktum, at aktiverne er blevet downloadet dynamisk. Der kræves en genstart for at fortsætte med fejlfinding.-ErrorAction SilentlyContinue
Tillader, at kommandoen mislykkes uden at klage, hvis den finder ud af, at processen ikke kører i øjeblikket.
Write-Host "Tak for din brug af mit værktøj!"
<# TODO: Tillad brugere at specificere outputplacering - sandsynligvis manuelt i øjeblikket
- Måske skal du tale med omdirigator for at få fat i 404 webadresser
- Tilføj dynamiske manglende mapper dynamisk #>
Resten af koden med nogle TODO’er.
Dette script gik jeg videre til Discord og var glad for at se, at nogle mennesker havde klonet det på Github (gennem analysen). Det er optimeret til Freearcade.com java-applets, men jeg håber at udvide det til at blive bedre.