You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows PowerShell 5.1中能否获取$MyInvocation.Statement等效值?

Windows PowerShell 5.1 获取调用语句完整文本的方案

Windows PowerShell 5.1没有$MyInvocation.Statement属性——这个属性是PowerShell 7.4.0-preview.2才新增的特性。如果要在5.1中实现类似获取完整调用语句的效果,只能通过模拟方式实现,以下是一个可行方案:

模拟实现思路

通过Get-PSCallStack获取调用栈信息,结合脚本文件内容(脚本内调用场景)拼接完整调用语句,同时处理多行参数的情况。

示例代码

function Get-InvocationStatement {
    # 获取上一层调用栈信息
    $callStack = Get-PSCallStack | Select-Object -Skip 1 -First 1
    if (-not $callStack.ScriptName) {
        # 交互式环境下直接返回调用行文本
        return $callStack.Position.Text
    }
    # 读取脚本文件内容
    $scriptContent = Get-Content -Path $callStack.ScriptName -Raw -Encoding UTF8 -ErrorAction SilentlyContinue
    if (-not $scriptContent) {
        return $callStack.Position.Text
    }
    $allLines = $scriptContent -split "`r?`n"
    $startLineIndex = $callStack.Position.StartLineNumber - 1
    # 初始化调用语句为起始行内容
    $statement = $allLines[$startLineIndex].TrimStart()
    # 处理多行数组/哈希表参数(以@(开头的情况)
    if ($statement -match '\(@$') {
        $bracketCount = 1
        $currentLineIndex = $startLineIndex + 1
        while ($bracketCount -gt 0 -and $currentLineIndex -lt $allLines.Count) {
            $currentLine = $allLines[$currentLineIndex]
            $statement += "`n" + $currentLine
            # 统计括号数量,判断是否结束
            $bracketCount += ($currentLine -split '\(').Count - 1
            $bracketCount -= ($currentLine -split '\)').Count - 1
            $currentLineIndex++
        }
    }
    return $statement
}

# 测试函数
function Test-Statement {
    param($MyParam)
    Get-InvocationStatement
}

# 测试调用
Test-Statement @(
    'foo'
    'bar'
    'baz')

局限性说明

这个模拟方案存在一些限制:

  • 仅能处理常见的多行参数场景(如数组@(...)),复杂语法结构(比如嵌套括号、跨行管道)可能解析不准确;
  • 交互式环境下的多行输入,可能无法完整捕获所有行;
  • 依赖脚本文件的可读性,如果脚本被混淆或加密,将无法正确读取内容。

内容的提问来源于stack exchange,提问作者Santiago Squarzon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 07:22:35