如何从字符串或文件路径编写函数以编码或解码 Base64?

How to write function to either Encode or Decode Base64 from either a string or path of file?

我有一个函数可以将字符串转换为适用于简单字符串的 base64。 但是像:

$String = "$program = "notepad"; start $program"

不起作用,中间的额外引号破坏了功能。我尝试使用脚本块,但它也不能完全正确地工作。这是我的第一个障碍。
这是那个函数:

function B64-FromString{
    [CmdletBinding()]
    param (
    
    [Parameter (Mandatory = $True, ValueFromPipeline = $True)]
    [string]$Text
    )
    
    $Text = {$Text}
    $Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text)
    $EncodedText =[Convert]::ToBase64String($Bytes)
    $EncodedText
}

我的下一个函数将文件路径作为参数并将文件的内容转换为 base64,然后 returns 转换后的代码。此功能按预期工作。 这是那个函数:

function B64-FromFile {
    [CmdletBinding()]
    param (
    
    [Parameter (Mandatory = $True, ValueFromPipeline = $True)]
    [Alias("source")]
    [string]$so,

    [Parameter (Mandatory = $False)]
    [Alias("output")]
    [string]$Path, 

    [Parameter (Mandatory = $False)]
    [Alias("FileName")]
    [string]$File 

    )   

    if (!$File) { $File = "converted.txt" }

    if (!$Path) { $Path = [Environment]::GetFolderPath("Desktop") }
    
    $FilePath = ($Path+"\"+$File)

    $converted = [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes((Get-Content -Path $so -Raw -Encoding UTF8)))
    
    return $converted
}

这里的最终目标是拥有一个函数,该函数将具有 encode/decode 的参数开关。 fromString/fromFile

的另一个开关

我认为在某些地方使用开关:

Param(
    [Parameter(Position=0)]
    [string[]]
    $m
)
$mode = switch ( $m )
{
    "enc"  { "encode-function" }
    "dec" { "decode-function" }
}

}

和另一个参数和开关,以区分从字符串或文件内容接收输入。

我仍在学习 powershell 并且很难将这种特定方法概念化。

因此,经过大约 10 个小时的试验,我想出了一个令我引以为豪的解决方案。

仍然愿意接受任何建设性的批评。

function b64 {
[CmdletBinding(DefaultParameterSetName="encFile")]
param(
    [Parameter(Position=0, ParameterSetName="encFile")]
    [string]
    $encFile,

    [Parameter(Position=0, ParameterSetName="encString")]
    [string]
    $encString,

    [Parameter(Position=0, ParameterSetName="decFile")]
    [string]
    $decFile,

    [Parameter(Position=0, ParameterSetName="decString")]
    [string]
    $decString

)

if ($psCmdlet.ParameterSetName -eq "encFile") {
        $encoded = [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes((Get-Content -Path $encFile -Raw -Encoding UTF8)))
        return $encoded
        }

elseif ($psCmdlet.ParameterSetName -eq "encString") {
        $File = "$env:TEMP\foob64.txt"
        Set-Content -NoNewline -Path $File -Value $encString    
        $encoded = [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes((Get-Content -Path $File -Raw -Encoding UTF8)))
        Remove-Item $File
        return  $encoded
        }

elseif ($psCmdlet.ParameterSetName -eq "decFile") {
        $data = Get-Content $decFile
        $decoded = [System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String($data))
        return $decoded     
        }

elseif ($psCmdlet.ParameterSetName -eq "decString") {
        $File = "$env:TEMP\foob64.txt"
        Set-Content -NoNewline -Path $File -Value $decString
        $data = Get-Content $File       
        $decoded = [System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String($data))
        Remove-Item $File
        return $decoded
        }
}