Откуда PowerShell берет символы новой строки, которые он вставляет в строки?

Рассмотрим следующий код PowerShell:

@"


"@.GetEnumerator() | %{[int]$_}

На моем компьютере это выводит

13
10

которые представляют собой десятичное представление управляющих символов ASCII для возврата каретки и перевода строки соответственно.

Тот же код, выполненный в AppVeyor, выводит только один номер:

10

Другими словами, кажется, что символы, которые PowerShell использует в этих строках, различаются в разных системах. Я ожидал, что источник будет [System.Environment]::newline, но такой же среда AppVeyor среда, которая выводит единственный символ в этой строке, вывод

13
10

для [System.Environment]::newline. [System.Environment]::newline, похоже, не является источником новых строк в строках здесь.


person alx9r    schedule 03.10.2017    source источник
comment
Он просто взял все, что есть в вашей строке. "@`"`n`n`n`"@.GetEnumerator() | %{[int]`$_}" | sc Test1.ps1; "@`"`n`r`n`n`"@.GetEnumerator() | %{[int]`$_}" | sc Test2.ps1; .\Test1.ps1 <#10#>; .\Test2.ps1 <#13, 10#>   -  person user4003407    schedule 03.10.2017
comment
Спасибо @PetSerAl. Похоже, AppVeyor проверяет файлы с помощью LF (\ n) окончания на Windows по умолчанию.   -  person alx9r    schedule 03.10.2017


Ответы (1)


Сценарий PowerShell по сути представляет собой строку. И это уже должно использовать "`n" или "`r`n" для разделения строк. Таким образом, если строковый литерал PowerShell пересекает несколько строк, то синтаксический анализатор PowerShell сохраняет разделители строк, которые использовались внутри этого строкового литерала, как часть значения строкового литерала.

Например это:

"'a`nb`r`nc'.GetEnumerator() | %{[int]`$_}" | Set-Content .\Test.ps1
.\Test.ps1

будет печатать:

97
10
98
13
10
99
person user4003407    schedule 06.10.2017