如何从字符串或文件路径编写函数以编码或解码 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
}
}
我有一个函数可以将字符串转换为适用于简单字符串的 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
}
}