/ Dykning i Windows PowerShell
Created 2019-03-11 Modified 2019-03-11

1099 Words

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.

Redirector

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.

Script-URL

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, og Read-Host læser brugerinput - i modsætning til at bruge Write-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 metoden DownloadFile 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 samme Split-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.