经过一些尝试之后找到了一个方法来为 cmdlet 修复工作目录路径问题
尽管看起很蠢,但是管用
至于可不可靠,那就不知道了
# 为同名 cmdlet 修复工作目录路径问题
function Get-Item {
# 不能使用 [Parameter()] 修饰参数
# 否则,未宣告的参数会被拒绝
param (
[string[]] $Path,
[string[]] $LiteralPath
)
# 重现以下几种管道功能
# $pathArray | cmdlet
# $pathArray | cmdlet -Path {$_}
# $pathArray | cmdlet -LiteralPath {$_}
[string[]] $vlueFromPipeLine = $input | ForEach-Object { $_ }
if ($vlueFromPipeLine.Count -gt 0) {
if ($null -ne $LiteralPath -and $LiteralPath[0] -eq '$_') {
$LiteralPath = $vlueFromPipeLine
}
elseif ($null -eq $Path -or $Path[0] -eq '$_') {
$Path = $vlueFromPipeLine
}
else {
Write-Error ''
return
}
}
$param = @{}
if ($LiteralPath.Count -gt 0) {
$param += @{
LiteralPath = $LiteralPath | ForEach-Object {
# 展开为路径为 PSDrive:\path\to\item
}
}
}
if ($Path.Count -gt 0) {
$param += @{
Path = $Path | ForEach-Object {
# 展开为路径为 PSDrive:\path\to\item
# 展开的部分要对特殊字符跳脱处理
}
}
}
# 呼叫 cmdlet 执行修改过的参数内容
Microsoft.PowerShell.Management\Get-Item @param @args
}
另外我还发现 Start-Process 下面三个路径参数坏得更彻底
只要有特殊字符就发生错误,连跳脱处理都无效
-RedirectStandardError
-RedirectStandardInput
-RedirectStandardOutput
PowerShell 处处都是地雷......