Mit ‘Powershell’ getaggte Artikel

Status des Repositories im Prompt

Freitag, 02. April 2010

Wie langweilig ist schon c:\Projekte\FBK> im Prompt zu haben?

Ein Microsoft-Mitarbeiter hat ein kleines Powershell-Skript veröffentlicht, dass den aktuellen Status des Repositories im Prompt anzeigt:

hg b:default c:1 modified, 1 unknown>

Eine sehr nette Idee!

Kompilieren, Verpacken und Hochladen

Montag, 29. März 2010

Mit Hilfe folgenden PowerShell-Skriptes kann ich nun den FBK kompilieren, verpacken und auf den Webspace hochladen. Leider gibt es in PowerShell keine funktionierende ZIP-Klasse, so dass ich hier auf 7-Zip zurückgreife:

msbuild FBK.sln /property:Configuration=Release

Remove-Item Deliverable -Force -Recurse
New-Item -type directory -f Deliverable

Copy-Item -Recurse FBK/src/bin/Release/ Deliverable/

& ‘C:/Program Files/7-Zip/7z.exe’ a Deliverable/Release.zip ./Deliverable/Release/

Write-Host "Benutzername: " -NoNewline
$user = Read-Host
Write-Host "Kennwort: " -NoNewline
$password = Read-Host
$currentDirectory = (Get-Item .).ToString()
$File = "$currentDirectory/Deliverable/Release.zip"
$ftp = "ftp://depon.net/htdocs/www.depon.net/downloads/fbk.zip"
$webclient = New-Object System.Net.WebClient
$webclient.Credentials = New-Object System.Net.NetworkCredential($user,$password)

$uri = New-Object System.Uri($ftp)
"Uploading $File…"
$webclient.UploadFile($uri, $File)

Das Skript besteht im Prinzip aus vier Teilen:

  1. Mit Hilfe von msbuild wird die VisualStudio-Solution als Release kompiliert.
  2. Danach finden ein paar Umkopieraktionen statt
  3. Über das Kommandozeilen-Interface von 7-Zip wird das Release-Verzeichnis gezippt. Im späteren Schritt werde ich vermutlich auf die Ionic-Zip-Library zurückgreifen.
  4. Nach Abfrage der Kenndaten wird mit Hilfe der WebClient-Klasse das Zip auf den FTP-Webserver hochgeladen. Hier ist es auch schade, dass es kein PowerShell-Skript für den FTP-Upload gibt.

Mit einem Server-‘Gegenskript’ werde ich in Zukunft eine bestehende FBK-Instanz beenden, das ZIP-Archiv herunterladen, entpacken, an die richtige Stelle legen und das Spiel starten. Damit lassen sich die Deployment-Zeiten auf ein minimales Reduzieren.

image

Aktuelle Changeset-ID eines hg-Repository herausfinden

Sonntag, 17. Januar 2010

In Powershell:

Get-ChangeSetId.ps1:

if ( $args.Count -eq 0 )
{
    Write-Host ( "No Repository given" );
}
else
{
    $repos = $args[0];
    hg -R "$repos" –debug tags | Select-String "tip" | % { $_ -match ":(.[0-9a-f])*" } | % { $Matches[0].Substring(1) }
}

Benutzung:

Get-ChangeSetId src\BurnSystems

Und um eine neue .hgsubstate-Datei aufzubauen:

dir * | % { "{1} src\{0}" -f $_.Name, (.\getchangesetid.ps1 $_) }

Das Resultat sollte dann einfach nachbearbeitet werden:

image

Die Powershell in der eigenen Konsolenapplikation

Montag, 04. Januar 2010

Auch genannt: An embedded powershell in a console application.

Dazu benötigt man im Prinzip nur zwei Schritte:

  1. Microsoft.PowerShell.ConsoleHost und System.Management.Automation als Verweis hinzufügen.
  2. Folgenden Quelltext in der einfügen.

// Create Powershell                                       
ConsoleShell.Start(
    RunspaceConfiguration.Create(),
    "Welcome to FBK-Shell",
    string.Empty,
    new string[] { });

Bei Ausführung dieses Befehles übernimmt die Powershell die Kontrolle über die Konsole:

image

Mit Hilfe des Powershell-Befehles

$game = [BurnSystems.FBK.App.ConsoleProgram]::Game

holt man sich das Spiel-Objekt.

Damit kann man nun direkt auf die Spielobjekte zugreifen:

PS> $game.DataStorage["world"].WorldData.Players | Select-Object {$_.Playername, $_.Towns[0].Resources.Available

{TEST2, Metal=3520, Crystal=3610, Fuel=3600, Energy=15, Fields=100, Construc…
{Undead, Metal=3605, Crystal=3602,5, Fuel=3600, Energy=15, Fields=100, Const…

Oder gar die Objekte manipulieren

image

Damit ist es nun für einen Spielbetreiber sehr einfach möglich Powershell-Skripte zu schreiben mit dessen Hilfe man direkt auf die FBK-Datenbank zugreifen kann. In den nächsten Wochen werde ich mich in dem Thema vertiefen, so dass man mit der PowerShell einfacher auf die Datenbank und der Logik zugreifen kann.

Als Beispiel schwebt mir folgendes Kommando vor:

$logic.GetLogic(“TradingPlatform”).GetAuctions() | % { $_.Cancel(); }

Dies ist prinzipiell jetzt schon mit folgenden Befehlen möglich:

# Initialisierung
$game = [BurnSystems.FBK.App.ConsoleProgram]::Game
$session = $game.LogicCore.CreateSession();
$auctionLogicType = [BurnSystems.FBK.Plugins.TradingPlatform.ITradingPlatformLogic]
$auction = $game.LogicCore.CreateLogicHandler($auctionLogicType)
$auction.LogicSession = $session;

# Anzeige aller Auktionen
$auction.GetAuctions() | % { $_.Data } | Format-Table

# Abbruch der Auktionen
$auction.GetAuctions() | % { $_.Cancel(); }

$auction.GetAuctions().Count

In der Shell sieht es folgendermaßen aus:

image