从命令行传递换行符给PowerShell

3
如何从命令行传递新的行符到PowerShell?
// MyScript.ps1:
[CmdletBinding()]
Param(
    [Parameter()] $Param
)

Write-Host $Param

// Command line (not PowerShell - cmd.exe!)
powershell.exe -File MyScript.ps1 -Param "First`nSecond"

无效。同时,使用命令行的新行字符\n也不起作用。那么如何向命令行传递新行?

4个回答

4

一种解决方法是在命令行中使用任何其他字符,例如\n,然后在PowerShell中替换它:

$x = $param.Replace("\n", "`n")

这个方法是可行的,但它只是一个hack而不是我首选的解决方案。


2
如果您在 replace 调用中重复使用反引号,则可以使用(反引号 n)。 $x = $param.Replace("``n", "n")` - Vesper

1

当使用变量从CMD调用时,我必须将参数作为文字传递(使用'而不是")。

示例pstest.ps1

Write-Host "Without Replace:"
Write-Host $args[0]

Write-Host #Blank Space for Readability
Write-Host "With Replace:"
Write-Host $args[0].Replace("\n", "`n")

通过CMD调用和结果:

> set "tmpvar=blar1 de \nblar2"
> powershell.exe .\pstest.ps1 '%tmpvar%'

Without Replace:
blar1 de \nblar2

With Replace:
blar1 de
blar2

哦,7年后的回复 - 谢谢。已点赞。 - D.R.

1

存在一个特殊字符,如第一行◙第二行


这似乎是一些特殊的新行字符,既不为PowerShell所知,也不为命令行所知。它确实可以与Write-Host一起使用,但与“反引号n”不同,例如不被ConvertFrom-StringData等cmdlet接受。遗憾 :-( - D.R.

0
你需要回车和换行符:
`r`n

所以这应该可以工作:

powershell.exe -File MyScript.ps1 -Param "First`r`nSecond"

谢谢,不过Write-Host命令并不会换行,而是输出rn。另外,如果我将参数传递给ConvertFrom-StringData,它也无法识别换行符... - D.R.
嗯,我尝试了这个脚本(保存为MyScript.ps1),它在两行中正确输出了字符串。你可以尝试使用Write-Host "FirstrnSecond"吗? - Martin Brandl
1
@jisaak 现在尝试使用原始的 cmd.exe。如果您在 Powershell 提示符下键入该命令,则脚本确实可以正常工作,但在 cmd.exe 提示符下则不行。 - Vesper
啊,我错过了那部分。 - Martin Brandl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接