PowerShell 使用 Start-Process 在脚本块中执行函数会用双引号做奇怪的事情

2023-12-29

我有一个编辑注册表的 PowerShell 脚本,因此需要以管理员身份运行。为此,我从正在运行的 PowerShell 脚本启动一个新的 PowerShell 进程,并使用其中包含函数的脚本块传递部分注册表项路径。当我在该函数中使用双引号时,PowerShell 尝试将它们解释为命令,而不是字符串。如果我使用单引号,那么一切都会正常。

我创建了一个简单的示例 powershell 脚本来重现该问题。这是片段:

$ScriptBlock = {
    function Test
    {
        $status = "This is a string"
        Write-Output $status
    }
}
Start-Process -FilePath PowerShell -ArgumentList "-NoExit -NoProfile -ExecutionPolicy Bypass -Command & {$ScriptBlock Test}"

因此,在新的PowerShell进程中,它会首先在脚本块中定义代码,然后调用Test方法,它会产生以下错误:

This :术语“This”未被识别为 cmdlet 的名称, 函数、脚本文件或可运行程序。检查拼写 名称,或者如果包含路径,请验证路径是否正确并且 再试一次。

所以它试图将字符串视为命令,就像我刚刚输入的一样This is a string在我的脚本中单独一行。

如果我改变线路

$status = "This is a string"

to

$status = 'This is a string'

脚本按预期工作并简单地输出字符串This is a string.

我注意到的另一个奇怪的问题是,如果我不使用变量而只使用:

Write-Output "This is a string"

然后它在单独的行上输出每个单词,如下所示:

This

is

a

string

但如果我使用这样的单引号:

Write-Output 'This is a string'

然后它会按预期在一行上输出整个句子。

有谁知道为什么 PowerShell 在这些情况下表现得很奇怪?

Answer

正如 TessellationHeckler 提到的,解决方案是将所有双引号括在双双引号、单引号中,或者您可以使用方括号。

所以在我的例子中,你会改变:

$status = "This is a string"

to this:

$status = """This is a string"""

or this:

$status = '"This is a string"'

or this:

$status = {"This is a string"}

如果您想计算字符串中的变量(即查看变量的值),那么您必须使用双双引号方法:

$status = """This is a string that evaluates $someVariable"""

仍然不确定这是一个错误还是设计使然,但至少我们有一个解决方法,因为这解决了我上面描述的两个问题。


如果我将你的脚本更改为

-Command $ScriptBlock

运行它,让它打开一个新的 shell 窗口,然后运行

gci function:test | fl 

在新窗口中查看函数定义,显示的代码是

$status = This is a string

对它显示的单引号版本进行相同的测试

$status = 'This is a string'

所以它失去了双引号。用双引号转义它们

$status = """This is a string"""

他们都顺利通过了。另外,即使脚本块是编译后的代码,在我看来,如果将它们扩展为字符串,它们就会作为文本嵌入:

> $s = { "hello" }
> "---$s---"
---"hello"---

所以我认为你遇到了这种引用问题:PowerShell 从命令行参数中去除双引号 https://stackoverflow.com/questions/6714165/powershell-stripping-double-quotes-from-command-line-arguments和答案Droj特别是,说“向外部程序发送参数的奇怪之处在于,存在额外的报价评估级别。我不知道这是否是一个错误,但我猜它不会改变,因为行为是当您使用 Start-Process 并传入参数时也是如此。”。

PowerShell 将脚本块作为字符串扩展到命令中,然后字符串周围的单引号将被重新解释为带引号的参数,并在调用中的某处删除。这要么是已知问题,要么是错误,要么是设计使然,具体取决于您如何阅读该链接的连接文章。

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

PowerShell 使用 Start-Process 在脚本块中执行函数会用双引号做奇怪的事情 的相关文章

  • 防止集成终端自动打开

    每当我在 VS Code 中打开 PowerShell 脚本时 集成终端就会打开 如何防止集成终端自动打开 我搜索了 终端 的设置 但没有发现与自动启动相关的内容 VSCode 会记住您的上一次会话 因此 如果关闭终端并退出 VSCode
  • 按 Enter 继续

    这不起作用 string temp cout lt lt Press Enter to Continue cin gt gt temp cout lt lt Press Enter to Continue cin ignore 或更好 in
  • 如何使用逗号和行分隔符对字符串进行标记

    我正在 Swift 中制作一个简单的 String Tokenizer 就像在 Java 中一样 但这对我来说确实不起作用 我的数据源中每行的末尾用 分隔 数据用逗号分隔 例如 字符串 1 字符串 2 字符串 3 字符串 1 字符串 2 字
  • 为什么使用 string::iterator 而不是索引? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么使用迭代器而不是数组索引 https stackoverflow com questions 131241 why use iterators instead of array indices
  • 在 String 值之后打印 int 值

    我有以下示例代码 int pay 80 int bonus 65 System out println pay bonus bonus pay 有人可以向我解释一下为什么我得到以下输出 145 6580 您的代码正在从左到右解释表达式 pa
  • 如何从字符串中分离字符和数字部分

    例如 我想分开 OS234 to OS and 234 AA4230 to AA and 4230 我使用了以下简单的解决方案 但我确信应该有一个更有效和更强大的解决方案 private void demo string cell ABCD
  • 无法在 Powershell 中运行 R.exe

    我经常发现在命令行 Windows 上运行 R 更有用 然而 当我在 Powershell 中尝试时 我往往会遇到问题 但这可以通过第一次运行轻松克服cmd然后就可以了 这是我执行此操作时遇到的错误R CMD BATCH Invoke Hi
  • 打印“X”个字符数与“X”字符串长度的所有可能组合(暴力破解)

    我正在尝试编写一个单词组合生成器 我的意思是打印 X 个字符数与 X 字符串长度的所有可能组合 首先 我需要说的是 我在 StackOverFlow 中看到了一个关于这个问题的问题 其中有很多单词生成器的答案来执行此操作 在不同的语言上 但
  • 在 C# 中检查 PowerShell 执行策略的最佳方法是什么?

    当你跑步时Get ExecutionPolicy在 PowerShell 中 它得到有效的执行政策 https learn microsoft com en us powershell module microsoft powershell
  • JavaScript:搜索字符串时的 indexOf 与 Match? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 使用之间是否存在明显的性能差异 str indexOf src and str match src 我个人比较喜欢match 和正则表达式 但同
  • 正则表达式 匹配捕获组内的文本

    示例文本 ruby object DynamicAttribute attributes resource id 1 resource type Applicant string value Michael int value id 359
  • 如何获取 64 位的 pshome 路径?

    32 位的主文件夹路径可以使用 PSHome多变的 c Windows System32 WindowsPowerShell v1 0 如何访问包含 64 位版本路径的变量 c Windows SysWOW64 WindowsPowerSh
  • 在 C++ 中,当我将值传递给函数时,它是否总是转换为适当的类型?

    如果我有一个像这样的函数void func size t x 我称该函数为func 5 5 立即转换为size t类型 这通常适用于所有类型吗 我问这个问题是因为我发誓我见过人们编写代码 他们做类似的事情func 5 0 将 5 作为双精度
  • 全局变量用例

    我有几个脚本和模块 它们使用全局变量来完成很多事情 我的日志记录可以采用以下三种形式之一 简洁 详细和验证 没有实际操作的详细日志记录 仅验证提供的数据 我还有许多函数 它们根据运行的上下文 用户或机器 而做出不同的响应 并且正在执行的操作
  • Start-Job 输出去了哪里?

    W gt job start job Write Output hi there throw an error Wait Job W gt job select State Failed HasMoreData True StatusMes
  • Python3,当 UserString 不表现为字符串时?

    在Python3中我使用UserString扩展内置字符串的功能 通常UserStrings 的行为就像strs 但与re我遇到了意想不到的情况TypeError bpython version 0 17 1 on top of Pytho
  • Python,将字典存储在数据库中

    在数据库中存储和检索 python 字典的最佳方法是什么 如果您对使用传统 SQL 数据库 例如 MySQL 不是特别感兴趣 您可以研究非结构化文档数据库 其中文档自然映射到 python 字典 例如MongoDB http www mon
  • Powershell 命令未发现异常

    我有以下 powershell 脚本 它使用一个函数并且可以在 ISE 中正常运行 Get ComputerSessions Computer localhost Functions Function Get ComputerSession
  • C 链表销毁函数

    我正在尝试学习 C 和很多人一样 我对指针有点困惑 无论如何 我创建了一个递归函数来销毁我的链表 但是正如我调试的那样 当我从函数返回时 列表的头部不应该为空 所以我猜这是对指针的一些基本误解 这是函数 void destroy struc
  • R:(中缀)运算符的两个定义之间的冲突:如何指定包?

    在 R 中 每当两个包定义相同的函数时 很容易指定要使用哪个包pkg foo 但是 当冲突的功能是一个时 你该怎么办 infix运算符 即使用定义 举个例子 两者ggplot2 and crayon define 有没有一种方法可以让我默认

随机推荐