經過一些嘗試之後找到了一個方法來為 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 處處都是地雷......