Проанализируйте URL-адрес для события

#powershell

Вопрос:

вот мой код до сих пор. В основном он использует URL-адрес события календаря Google и пытается извлечь идентификатор события из того, что ему задано, а затем выполнить команду.

 function ParseGoogleEvent {
    param (
        [parameter(Mandatory = $true,
            HelpMessage = "Enter entire url of event or event ID"
        )][string]$EventURL,
        [parameter(Mandatory = $False,
            HelpMessage = "Enter to forum full GAM Command"
        )][string]$Email,
        [parameter(Mandatory = $False,
            HelpMessage = "Will run the GAM command with -Email"
        )][switch]$Run
    )

    Try {
        [uri]$TestURI = $EventURL
        $TestURI = $TestURI.segments[6]
    }
    Catch {
        $TestURI = $TestURI.OriginalString
    }

    function Get-PaddingRequired {
        param (
            [Parameter(Mandatory = $true)]
            [String]$InputString
        )
        $modulo = ($InputString.Length % 3)
        
        switch ($modulo) {
            0 { $paddingRequired = $null }
            1 { $paddingRequired = '==' }
            2 { $paddingRequired = '=' }
        }
        Return [string]$paddingRequired
    }
    
    $Padding = Get-PaddingRequired -InputString $TestURI
    $TestURI = "$TestURI   $Padding"

    Try {
        $Result = [System.Text.Encoding]::Default.GetString([System.Convert]::FromBase64String($TestURI))
    }
    Catch {
        Write-Warning "Problem with input of $EventURL.`nTry entire url."
        Return $null
    }

    $Result = $Result.split(" ")[0]
    IF ([string]::IsNullOrWhiteSpace($Email)) {
        Write-Warning "GAM calendar <Email> info event id $Result"
    }
    Else {
        Write-Warning "GAM calendar $Email info event id $Result"
        If ($Run) {
            $File = $Email   'Event.txt'
            GAM calendar $Email info event id $Result > $File
            Write-Host $File
        }
    }

    Return [string]$Result
}
 

Проблема с моим кодом в том, что он не учитывает различные способы ввода строки.

Мой код может в настоящее время обрабатывать 2 из 3 was.

Не могу справиться. (Следующее взято из диагностики календаря Google)

 Event{eid=69uqr7fedmm5elmtout52hu0or_20211006T160000Z, <Blah blah}
 

Потому что по большей части он уже разобран

Мой код справится.

 https://calendar.google.com/calendar/u/0/r/eventedit/Njl1cXI3ZmVkbW01ZWxtdG91dDUyaHUwb3JfMjAyMTEwMDhUMTYwMDAwWiBkYW4uY2FzbWFzQHNvbm9zLmNvbQ
and
Njl1cXI3ZmVkbW01ZWxtdG91dDUyaHUwb3JfMjAyMTEwMDhUMTYwMDAwWiBkYW4uY2FzbWFzQHNvbm9zLmNvbQ
 

Есть хорошие идеи о том, как найти идентификатор события для всех 3 примеров ?

Ответ №1:

Вы можете использовать -match оператор для проверки того, находится ли входная строка в формате, отличном от base64, как это:

 # $EventURL = 'Event{eid=69uqr7fedmm5elmtout52hu0or_20211006T160000Z, <Blah blah}'

if ($EventURL -match 'Event{.*?beid=(w ).*?}') {
    # The Event{...} format was passed, grab the eid value from the capture group above
    $Result = $Matches[1]
}
else {
    # your existing code parsing the URL/base64 format goes here
}

if ([string]::IsNullOrWhiteSpace($Email)) {
    Write-Warning "GAM calendar <Email> info event id $Result"
}
else {
    Write-Warning "GAM calendar $Email info event id $Result"
    if ($Run) {
        $File = $Email   'Event.txt'
        GAM calendar $Email info event id $Result > $File
        Write-Host $File
    }
}

return [string]$Result
 

Комментарии:

1. Как мне научиться создавать шаблоны соответствия ? if ($EventURL -match 'Event{.*?beid=(w ).*?}')

2. @dcaz, изучи регулярное выражение