我有一个函数可以将字符串转换为适用于简单字符串的 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: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
}
}
字符串的编码不起作用。以某种方式在字符串末尾添加了一个“%”。通过这种方式可以更轻松地完成字符串编码(我没有检查文件参数):
function b64 {
[CmdletBinding(DefaultParameterSetName="encString")]
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") {
[Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($encString))
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") {
$decoded = [Text.Encoding]::Utf8.GetString([Convert]::FromBase64String($decString))
return $decoded
}
}