Een probleem die ik opgelost heb powershell is het verplaatsen van de films in een map in de naam van de genre waar de film onder valt. Dit is gedaan door de API van Radarr te gebruiken en de films uit te lezen. Vervolgens per film te bepalen waar deze hoort te staan (map met genre) en vervolgens controleren of deze daar al staat. Zo niet, dan verplaatsen via een API request.
Een andere oplossing waarvoor powershell uitstekend gebruikt kan worden is ht bijwerken van een DDNS record in de DNS omgeving van NameSilo:
Ik heb natuurlijk een aantal variable weg gelaten die verwijzen naar mijn eigen DNS zone bij namesilo. Dat zijn $APIkey, $Domain en $Record.
# Gather data about the DNS entries in the domain
$listdomains = Invoke-RestMethod -Uri "https://www.namesilo.com/api/dnsListRecords?version=1&type=xml&key=$APIkey&domain=$domain"
# Write-Host "Domain list:" -ForegroundColor Yellow
# $listdomains.namesilo.reply.resource_record | Select Host, Type, Value | FT -AutoSize
# Write-Host "Find DNS record..." -ForegroundColor Yellow
$CurrentIP = $listdomains.namesilo.request.ip
$RecordIP = ($listdomains.namesilo.reply.resource_record|where {$_.host -eq "$record.$domain"}).value
$RecordID = ($listdomains.namesilo.reply.resource_record|where {$_.host -eq "$record.$domain"}).record_id
Write-host "Current IP for $record.$domain is $RecordIP" -ForegroundColor Yellow
# If the current IP address is not the same as the one in the record it updates it
if ($CurrentIP -ne $RecordIP)
{
$update = Invoke-RestMethod -Uri "https://www.namesilo.com/api/dnsUpdateRecord?version=1&type=xml&key=$APIkey&domain=$Domain&rrid=$RecordID&rrhost=$record&rrvalue=$CurrentIP&rrttl=3600"
Write-Host "Updating DNS record $record.$domain to $CurrentIP was $($update.namesilo.reply.detail)" -ForegroundColor Yellow
}
Het probleem. Stel je hebt een string en daarin wil je waarden vervangen door de inhoud van een andere string. Dat is eenvoudig te doen met een replace. Maar als je er nog een schep bovenop doet, je wilt de inhoud van een veld die je in de eerste string opgeeft. Dan wordt het pas leuk:
De string:
Via match kan je wel de eerste <VALUE opzoeken, alleen deze komt niet bij de 2e:
$Field = $string -match '\<VALUE=(.*)\>'Write-Host "Replace = $($Matches[0]) with the value of field $($Matches[1])"De $matches variable daar staat alleen de eerste in. Yellow komt niet terug. Dan een andere methode:
$Fields = Select-String -pattern '\<VALUE=(.*)\>' -input $String -AllMatchesForEach ($Field in $Fields.Matches){ $Temp = $Field.Value.Substring(1,($Field.Value.Length -2)) -split '=' Write-Host "Replace = $($Field.Value) with the value of field $($Temp[1])"}En dit werkt. De select string maakt in de $Fields.Matches een lijst van alle velden die overeenkomen met de reguliere expressie (REGEX). En onder de write-host kunnen we natuurlijk de replace doen.
Heel handig voor het testen van reguliere xpressies: https://regex101.com/
Hier kan je