AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 76932104
Accepted
Ωmega
Ωmega
Asked: 2023-08-19 03:30:04 +0800 CST2023-08-19 03:30:04 +0800 CST 2023-08-19 03:30:04 +0800 CST

通过 Invoke-Command 执行的代码会引发错误

  • 772

当我跑步时

Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table –AutoSize

直接从 PowerShell 运行,代码运行得很好。

但是,当我将这个确切的代码放入文件script.txt然后运行时

$stdout = Invoke-Command -ScriptBlock ([ScriptBlock]::Create((Get-Content 'script.txt'))) *>&1 

我收到以下错误:

Exception calling "Create" with "1" argument(s): "At line:1 char:163
+ ... me, DisplayVersion, Publisher, InstallDate | Format-Table –AutoSize
+                                                                 ~~~~~~~~~
The string is missing the terminator: "."

是什么导致了这种行为?我必须如何调整代码才能从外部 txt 文件执行脚本?

powershell
  • 1 1 个回答
  • 31 Views

1 个回答

  • Voted
  1. Best Answer
    mklement0
    2023-08-19T04:29:20+08:002023-08-19T04:29:20+08:00

    太长了;博士

    这意味着您正在使用Windows PowerShell并且存在字符编码问题。
    (这个问题在PowerShell (Core) 7+中不会出现,其一致的默认编码现在是(无 BOM)UTF-8。)

    您有两种解决方案选择:

    • 或者:将文件重新保存为带有 BOM 的script.txtUTF-8 。

    • -Encoding utf8或者:与您的通话一起使用Get-Content(请注意下面的错误警报):

    # Note the addition of -Encoding utf8.
    # -Raw is added for robustness; it would be needed for *multiline* scripts.
    Invoke-Command -ScriptBlock (
       [ScriptBlock]::Create(
         (Get-Content -Encoding utf8 -Raw 'script.txt')
       )
     ) *>&1 
    

    一个更简单的替代方法是使用Invoke-Expression(但是通常最好避免使用):

    Get-Content -Encoding utf8 -Raw 'script.txt' | Invoke-Expression *>&1
    

    错误警报:

    当将上述推荐与重定向相结合时*>&1,错误输出特别消失,即它意外地没有合并到成功输出流(1)中。

    这适用于Windows PowerShell(不会修复)和PowerShell(核心)(至少 v7.3.6);相关的错误报告是GitHub issues #10476。

    解决方法是在应用之前将Invoke-Command调用或Invoke-Expression管道包含在(...)分组运算*>&1符中,例如:

    # Note the (...), which has side effects, however.
    (Get-Content -Encoding utf8 -Raw 'script.txt' | Invoke-Expression) *>&1
    

    该解决方法有一个副作用:使用(...)意味着在应用重定向并生成输出之前,首先将所附命令的所有输出全部收集到内存中。


    背景资料:
    • 您的文件似乎script.txt是 UTF-8 编码的,但缺少 BOM,这会导致Windows PowerShell将您的文件误解为 ANSI 编码(即,使用系统旧语言环境的单字节 ANSI 代码页)。

    • 这并不明显,但您的文件包含非 ASCII 范围字符:

      • in是 EN DASH字符,而不是通常的 ASCII 范围, –( HYPHEN-MINUS, ) 字符。–AutoSizeU+2013--U+002D

      • 当 3 字节 UTF-8 编码–被误解为 ANSI 时,每个字节本身就变成一个字符,具体来说:–

    PowerShell接受“(LEFT DOUBLE QUOTATION MARK, U+201C) 作为通常的 ASCII 范围双引号 QUOTATION MARK 的替代,U+0022它会导致语法错误,因为缺少右双引号。

    同样,PowerShell 接受 -(EN DASH) 代替 ASCII-range -。

    有关 PowerShell 支持的语法功能的可互换引号和标点字符的完整列表,请参阅此答案。

    然而,为了稳健性,通常最好使用 ASCII 范围字符。

    顶部部分中的补救措施可以避免该问题。

    • 1

相关问题

  • 如何获取作业的进程句柄?

  • PowerShell 一行代码 - 如何

  • Powershell 5.1:我的模块中缺少别名描述

  • Import-CSV:将行(成员)添加到 foreach 循环中的结果对象

  • 在所有startthreadjob powershell中使用和修改我的变量

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    使用 <font color="#xxx"> 突出显示 html 中的代码

    • 2 个回答
  • Marko Smith

    为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类?

    • 1 个回答
  • Marko Smith

    您可以使用花括号初始化列表作为(默认)模板参数吗?

    • 2 个回答
  • Marko Smith

    为什么列表推导式在内部创建一个函数?

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 个回答
  • Marko Smith

    为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)?

    • 4 个回答
  • Marko Smith

    为什么库中不调用全局变量的构造函数?

    • 1 个回答
  • Marko Smith

    std::common_reference_with 在元组上的行为不一致。哪个是对的?

    • 1 个回答
  • Marko Smith

    C++17 中 std::byte 只能按位运算?

    • 1 个回答
  • Martin Hope
    fbrereto 为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 您可以使用花括号初始化列表作为(默认)模板参数吗? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi 为什么列表推导式在内部创建一个函数? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A fmt 格式 %H:%M:%S 不带小数 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python C++20 的 std::views::filter 未正确过滤视图 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute 为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa 为什么库中不调用全局变量的构造函数? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis std::common_reference_with 在元组上的行为不一致。哪个是对的? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev 为什么编译器在这里错过矢量化? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan C++17 中 std::byte 只能按位运算? 2023-08-17 17:13:58 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve