Powershell“Set-PSDebug -Trace 2”导致意外结果

2024-05-06

我遇到一个奇怪的问题,在设置“Set-PSDebug -Trace 2”时出现不同的行为。

我追踪到 switch 语句未正确执行,并且能够在 Powershell V3 上重现它,但不能在 Powershell V2 或 Powershell V1 上重现它(按预期工作)

采用以下简单函数:

function DoTest {
$result = "Switch Case Not Executed"
$VendorName = "Microsoft"
switch ($VendorName)
{
    "Microsoft" { $result = "Switch Case Executed" }
}
Write-host "Switch: $($VendorName) -> $result"

}

现在运行以下命令:

#Works as expected
Set-PSDebug -Off; DoTest;

#Doesn't work as expected
Set-PSDebug -Trace 2; DoTest;

使用 PSDebug Trace 在 PosH V3 上的结果

DEBUG:    3+ Set-PSDebug -Trace 2;  >>>> DoTest;
DEBUG:    1+ function DoTest  >>>> {
DEBUG:     ! CALL function 'DoTest'
DEBUG:    2+      >>>> $result = "Switch Case Not Executed"
DEBUG:     ! SET $result = 'Switch Case Not Executed'.
DEBUG:    3+      >>>> $VendorName = "Microsoft"
DEBUG:     ! SET $VendorName = 'Microsoft'.
DEBUG:     ! SET $switch = 'Microsoft'.
DEBUG:    4+     switch ( >>>> $VendorName)
DEBUG:     ! SET $switch = ''.
DEBUG:    9+      >>>> Write-host "Switch: $($VendorName) -> $result"
DEBUG:    9+     Write-host "Switch: $( >>>> $VendorName) -> $result"
Switch: Microsoft -> Switch Case Not Executed
DEBUG:   11+  >>>> }

在 PoSH 版本 3 中,即使调试跟踪也表明该值已设置,但似乎完全跳过了 switch 语句。我什至尝试过Set-StrictMode一切都运行良好。仅当我启用 PSDebug 跟踪时才会出现此情况。这种行为是故意的吗?


经过详尽的调查,这似乎是 Powershell 中的一个错误。这$switch变量在调试模式下被破坏,最终成为某种数组枚举器、空数组或类似的愚蠢的东西。我建议提交问题http://connect.microsoft.com http://connect.microsoft.com

解决方法1:

# Pro: No scoping differences between if statement blocks and function
# Con: big piles of If ... else if ... else if ... can get really annoying to code and maintain
# Con: Statements are limited to single execution, pipeline is lifted to function level instead of statement level
... same code as before but using an if instead of switch ...
if($VendorName = 'Microsoft') { $result = "Switch Case Executed" }
else { $result = "FAIL!" }

解决方法2:

# Pro: Each script block is self-contained and has private scope
# Pro: "cases" can be added without modifying DoIt function, and even passed into the function 
# Pro: "cases" can be used in a pipeline
# Con: Indirect script blocks can be difficult to understand at first
function DoTest {
    $result = "Switch Case Not Executed"
    $VendorName = "Microsoft"

    $SwitchHack = @{
        Microsoft = { "Microsoft Case Executed" }
        Default = { "Default Case Executed" }
    }

    if($SwitchHack.Keys -contains $VendorName) {
        $result = $SwitchHack."$VendorName".InvokeReturnAsIs()
    } else {
        $result = $SwitchHack.Default.InvokeReturnAsIs()
    }

    'Switch: {0} -> {1}' -f $VendorName, $result | Write-Host 
}

Set-PSDebug -Trace 2
DoTest

因为我很无聊,所以我写了解决方法 3,它只是 2,将 Switch 移到了函数中

function Switch-Object {
    param(
        [Parameter(Mandatory=$true)]
            [String]$In,
        [Parameter(Mandatory=$true)]
            [hashtable]$Actions
    )

    try {
        $Actions."$In".InvokeReturnAsIs()
    } 
    catch {
        throw "Unknown Action Label"
    }
}

function DoTest {
    $result = "Switch Case Not Executed"
    $VendorName = "Microsoft"

    $VendorActions = @{
        Microsoft = { "Microsoft Case Executed" }
    }

    $result = Switch-Object -On:$VendorName -Actions:$VendorActions
    'Switch: {0} -> {1}' -f $VendorName, $result | Write-Host 
}

Set-PSDebug -Trace 2
DoTest
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Powershell“Set-PSDebug -Trace 2”导致意外结果 的相关文章

  • 如何在管道函数中使用 Write-Progress?

    我正在尝试编写一个函数PowerShell接受管道输入 我想使用显示进度条Write Progress 管道中每个项目的增量 例如 function Write PipelineProgress Cmdletbinding Param Pa
  • 在 .Net 中保持 Powershell 运行空间打开

    我正在尝试从 VB Net 中运行一些 PowerShell 代码 如果您知道的话 C 编码器也可能会有所帮助 代码的第一部分 我需要使用密码连接到 na 控制器 并且需要保持连接打开 我还有其他命令需要通过单击按钮来运行 获取文件 显示文
  • 动态参数值取决于另一个动态参数值

    启动前提 非常严格的环境 Windows 7 SP1 Powershell 3 0 使用外部库的可能性有限或不可能 我正在尝试重写之前创建的 bash 工具 这次使用 PowerShell 在 bash 中 我实现了自动完成功能 以使该工具
  • 通过 PowerShell 运行 .cmd 文件

    我正在尝试使用 PowerShell 在远程服务器上运行 cmd 文件 在我的 ps1 脚本中我尝试过 C MyDirectory MyCommand cmd 它会导致此错误 C MyDirectory MyCommand cmd is n
  • 在 PowerShell 中显示 Unicode 表情符号

    我想在 PowerShell 中显示像 U 1F4A9 这样的 Unicode 表情符号 我知道这仅在 ISE 控制台内有效 但我不知道如何操作 到目前为止我尝试过的 CharBytes System Text Encoding Unico
  • 将带有星号的注册表项传递给测试路径

    我想通过以下方式运行此注册表路径Test Path在 PowerShell 中 但它包含一个星号 该星号在注册表中有效 但在 Windows 路径中无效 问题是 当我通过它时 Test Path将星号视为通配符 因此这需要非常非常长的时间
  • PrepareForSegue之谜

    我在两个不同的 VC 中有一个prepareForSegue 方法 一个使用一个if声明 而另一个旨在使用switch 除了名称之外 代码几乎相同 这个效果很好 void prepareForSegue UIStoryboardSegue
  • 是否有一种更简单的方法可以并行运行命令,同时在 Windows PowerShell 中保持高效?

    此自我回答旨在为那些受困于 Windows PowerShell 并由于公司政策等原因而无法安装模块的用户提供一种简单且高效的并行替代方案 在 Windows PowerShell 中 built in可用的替代方案local并行调用是St
  • 如何捕获从 Powershell 运行的控制台 exe 的二进制标准输出?

    是否可以让 Powershell 将 exe 的标准输出读入 byte 而不是通常的文本处理行数组 我能做的最好的事情是 cmd c foo exe gt foo tmp b io file readallbytes foo tmp del
  • 仅从 AD 获取计算机名称

    我是 Power Shell 新手 正在测试一些命令和想法 我坚持认为应该很简单的事情 我想将 AD 中计算机对象的名称提取到文件中 到目前为止我正在尝试的方法是这样的 computers Get ADComputer Filter For
  • Azure Runbook 输出到电子邮件

    我正在尝试将 VM 状态的输出从 Azure 自动化 Runbook 发送到电子邮件中 我使用以下代码 function Send EMail Param Parameter Mandatory true String EmailTo Pa
  • 使用 WebClient 在 PowerShell 脚本中将 FTP 从二进制更改为 ascii

    简单的 PowerShell 脚本 它可以毫无问题地下载文件 二进制 我需要它的ascii 格式 File c temp ftpfile txt ftp ftp myusername email protected cdn cgi l em
  • Powershell:当文件名包含字符 [ ] 时,移动项目不起作用

    关于使用 PowerShell 移动项目的简单问题 有谁知道为什么当文件名包含 或 字符时以下脚本不起作用 前任 文件1 VT txt ls j foreach itemName Name Replace destination ls wh
  • 如何重构这个 switch 语句?

    string liquidClass string Empty switch cmbLiquidClass Text case LiquidClass1 liquidClass Settings Default LiquidClass1 b
  • 调用函数时切换“控制转移绕过初始化:”

    当我尝试构建以下开关时 出现 控制转移绕过初始化 错误 switch retrycancel case 4 The user pressed RETRY Enumerate all visible windows and store han
  • 阻止单引号在 WMI 查询 powershell 中转义字符串

    我有一些使用 WMI 查询的代码 但我遇到了一个问题 我使用的变量有一个 单引号 这会导致代码出现故障 这是一个例子 path SERVER1 Mike O Leary servername path Split 2 Split 0 sha
  • 使用 Powershell 在字符串中搜索反斜杠

    我需要搜索字符串中反斜杠的数量以确定一些文件路径参数 我还没有找到一种方法来搜索反斜杠而不让 Powershell 认为它是一个转义字符 regex Matches FilePath count Or a match 这两个都会出现错误 非
  • 在 powershell 3 中美化 json

    给定一个标准 json 字符串值 jsonString baz quuz cow moo cud foo bar 我怎样才能让这一切都漂亮的换行符 最好没有强力正则表达式 到目前为止我发现的最简单的方法是 jsonString Conver
  • Foreach-object Parallel 块内的错误处理 - Powershell 7

    在下面的 Foreach Object Parallel 块中捕获错误的最佳方法是什么 因为将有三个单独的线程 运行空间运行并执行块中写入的代码 并且可能同时发生多个错误 异常 是否可以捕获列表 变量中的所有错误并在脚本执行结束时显示 1
  • JavaScript IDE/编译器

    现在 我希望你们中的一些人能够理解我的要求 我是编程新手 我在 Codecademy com 上了解了 JavaScript 我使用 labs codecademy com 来编写 JavaScript 但它有限制 对于编程新手来说 我可以

随机推荐

  • 覆盖 VK_Tab 焦点操作

    再会 我正在向 jTextField 添加 keyevent 侦听器 以便如果用户按下 Tab 键 插入符号位置将转到 jtextField 内文本的末尾 这是我的代码 private void jTextField1KeyPressed
  • Django migrate:不创建表

    经过一些错误后 我删除了数据库 删除了所有迁移文件 我留下了init py 现在 当我跑步时 python migrate py makemigrations It creates migrations correctly python m
  • TextView 用字母打乱了我的话

    我的要求 创建 传入气泡 其宽度按内容排列 最大宽度为 90 我有这个标记
  • 在 NodeJS 中处理长时间运行的进程?

    我看过一些较旧的帖子涉及这个主题 但我想知道当前的现代方法是什么 用例是 1 假设您想要在视频文件上执行长时间运行的任务 例如 60 秒长 例如jspm install这最多可能需要 60 秒 2 不能对任务进行细分 其他要求包括 需要知道
  • 使用 Vue.JS 时,我们是否被迫在 CSP 中使用“unsafe-inline”?

    有没有办法让 Vue js 与 CSP 正常配合 当我运行我的spa应用程序 由npm run generate使用 Nuxt js 我会收到几个警告 例如 拒绝应用内联样式 因为它违反了以下规定 内容安全策略指令 style src se
  • UICollectionView 访问错误 -> UICollectionViewData _setLayoutAttributes:GlobalIndex:

    我使用 UICollectionView 来显示大量图像 其中一批为 32 个 每次到达集合视图的末尾时 我都会加载另一批 32 个图像 并调整 collectionView contentsize width 的大小以接受新项目 通过使用
  • 进度对话框未显示在屏幕上

    我根据亲爱的 Mayank answer 编辑了我的代码 但它没有显示在方法开始之前在 displayMsg 方法中作为输入发送的任何消息 我应该说 MethodTest 是通过 nfc 和 onNewIntent Intent Inten
  • 如何在 Web Api 中将对象作为参数传递

    我想在我的 web api GET 和 POST 方法中将对象作为参数传递 我的代码是 HttpGet Route mytest list model public IHttpActionResult GetAllTypes TestMod
  • 在java中使用共享密钥加密/解密?

    我有客户令牌 我正在从一个 Web 应用程序 如 app1 发送到另一个 Web 应用程序 如 app2 我想加密客户令牌 在 app1 上 并使用在 app1 和 app2 上共享的密钥在 app2 上对其进行解密 我不知道如何开始 这将
  • 如何跟踪用户在我的 Android 应用程序上花费了多少时间?

    我想跟踪用户在我的 Android 应用程序上花费了多少时间 当用户在应用程序上处于活动状态时 我可以获取以小时为单位的时间吗 它会自动跟踪 Note 应用程序不在 Google Play 上 此代码将帮助您获取应用程序使用时间 long
  • 在 Inno Setup 中实现脚本常量时出现“预期标识符”或“原型无效”

    因此 鉴于此功能 我在GetRoot ROOTPage Values 0 线 我希望它告诉我ROOTPage没有定义 const DefaultRoot C IAmGRoot Var ROOTPage TInputQueryWizardPa
  • Java无限信号量

    想知道如何not使用信号量限制连接 或任何东西 所以你可能会想 这听起来很愚蠢 但是 它稍微简化了我的代码 因为它让我可以统一处理有限和无限的情况 请注意 我并不是在寻找有关如何编写类似内容的建议 if limited semaphore
  • K&R 之后用什么书来学习纯 C 编程? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • JS jQuery - 检查值是否在数组中

    我更喜欢 PHP 而不是 JS 我认为我的问题更多是语法问题 我有一个小的 jQuery 来 验证 并检查输入值 它适用于单个单词 但我需要数组 我正在使用inArray jQuery 的 var ar value1 value2 valu
  • Android Vector Drawable 不支持。如何修复它?

    尝试从 AndroidStudio 2 2 Ubuntu 14 04 的本地 svg 文件生成矢量资源时出现此错误 Could not generate a preview In icon svg ERROR line 6
  • 在Application_Start中访问ninject内核

    我正在使用 Ninject 和随 nuget 安装的 MVC3 扩展 我的内核设置代码位于 App Start NinjectMVC3 cs 文件中 控制器中的一切都运行良好 但我无法弄清楚如何 正确 绑定 Global asax cs M
  • 将 JS 文件导入 Typescript

    我正在考虑转向 Typescript 目前正在考虑慢慢地 如果可能的话 逐个文件地执行此操作 现在我目前拥有的系统是用 Webpack 构建的 我想继续这个来构建我的整个包 我有一个用于定义的 d ts 文件 但我需要继续导入当前引发错误的
  • PHP 错误:php_network_getaddresses:getaddrinfo 失败:(从其他站点获取信息时。)

    尝试从外部源获取信息时 我收到以下错误 Warning php network getaddresses getaddrinfo 失败 第 行名称解析暂时失败 昨天一切都很好 那么这个脚本发生了什么 它不起作用并给我上面的错误 有什么解决方
  • 将 sudo 与 Python 脚本结合使用

    我正在尝试编写一个小脚本来在每次执行脚本时安装 VirtualBox 共享文件夹 我想用Python 来做这件事 因为我正在尝试学习它来编写脚本 问题是我需要特权才能启动挂载命令 我可以将脚本作为 sudo 运行 但我更喜欢它自己创建 su
  • Powershell“Set-PSDebug -Trace 2”导致意外结果

    我遇到一个奇怪的问题 在设置 Set PSDebug Trace 2 时出现不同的行为 我追踪到 switch 语句未正确执行 并且能够在 Powershell V3 上重现它 但不能在 Powershell V2 或 Powershell