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



我有一个将字符串转换为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,然后返回转换后的代码。该函数按预期工作。这就是函数:

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
}

这里的最终目标是有一个函数,它将具有编码/解码的参数开关。还有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:TEMPfoob64.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:TEMPfoob64.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
}
}

最新更新