gpt4 book ai didi

powershell - 通过 Cmd 将换行符传递给 PowerShell

转载 作者:行者123 更新时间:2023-12-02 22:36:36 34 4
gpt4 key购买 nike

我正在尝试从 Windows cmd.exe 运行 PowerShell 脚本。 PowerShell 脚本的输入是一个字符串,其中包含使用 PowerShell 反引号转义的换行符 - 即:

`r`n

出于演示目的,输入字符串随后会写入控制台,并转储到文件中。

我遇到的问题是,当脚本从 cmd.exe 使用语法运行时
powershell.exe script.ps1 "TEST`r`nTEST"

字符串中的换行符不被视为换行符,并按字面包含在控制台输出和输出文本文件中。
TEST`r`nTEST

但是,如果我从 PowerShell 环境运行它,我会得到预期的结果(即正确解析换行符,并在适当的位置插入换行符)。
TEST
TEST

同样,如果我传入 \r\n而不是通过 Windows cmd.exe 转义的换行符,并执行 .replace在 PowerShell 脚本中
$date = $data.replace("\r\n","`r`n")

我得到预期的输出:
TEST
TEST

有没有人能够解释为什么会发生这种情况?

测试脚本如下:
param([string]$data) # data to send

Write-Host $data
[IO.File]::WriteAllText('d:\temp.txt', $data)
return 0

该文件从命令行调用为:
powershell.exe script.ps1 "TEST`r`nTEST"

该脚本在 Windows Server 2012 R2 上运行,使用 PowerShell v4.0

最佳答案

tl;博士

使用 -Command并将整个 PowerShell 命令作为单个字符串传递;例如。:

 C:\> powershell -NoProfile -Command "script.ps1 \"TEST`r`nTEST\""
TEST
TEST

注意内部如何 "实例被转义为 \" ,当从外部调用时 PowerShell 需要它(或者,使用 """ )。

在您的具体情况下, powershell -NoProfile -Command script.ps1 "TEST`r`nTEST"也会起作用,但通常只有在字符串没有嵌入空格时才能按预期工作。
鉴于 -Command是 PSv5.1 之前的默认设置,您的命令 - 正如当前发布的 - 应该按原样工作。

从 PowerShell v5.1 开始,参数传递给 powershell.exe从外部:
  • 有解释权通过 PowerShell,包括字符串插值,默认情况下以及当您使用 -Command (即,既不指定 -File 也不指定 -Command 当前默认为 -Command )。
  • 警告:默认行为将在 v6 中改变:-File将是默认值 - 请参阅 relevant change on GitHub .
  • 不受解释如果您使用 -File 调用脚本 - (在可能被 cmd.exe 解释后)PowerShell 将所有参数视为 文字字符串 .
  • 警告:这个 行为是 currently being discussed关于 v6 ,鉴于至少在一种情况下存在明显的问题:尝试传递 bool 值。


  • 可选阅读:为什么在使用 -Command 时应该将整个 PowerShell 命令作为单个参数传递:

    当您使用 -Command使用多个参数,PowerShell 在执行之前基本上将它们组装到幕后的单个命令行中。

    任意 "..." - 在过程中丢失了对单个参数的引用,这可能会产生意想不到的结果;例如。:
    C:\> powershell -NoProfile -Command "& { $args.count }" "line 1`r`nline 2"
    3 # !! "line 1`r`nline 2" was broken into 3 arguments

    鉴于外 "..."在解析命令行的过程中删除了引号,PowerShell最终执行的实际命令行是:
     C:\ PS> & { $args.Count } line 1`r`nline 2
    3

    为了说明原因,让我们看一个使用显式引用的等效命令:
     C:\ PS> & { $args.Count } "line"   "1`r`nline"   "2"

    换句话说:在封闭 " 之后被删除,结果标记像往常一样被空格分成多个参数。

    关于powershell - 通过 Cmd 将换行符传递给 PowerShell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44752229/

    34 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com