Вкл. ввод , PowerShell принимает `r`n
(Windows в стиле) и `n
(Unix в стиле) и новые строки взаимозаменяемо , независимо от платформы (ОС), на которой он работает; это относится как к чтению файлов исходного кода PowerShell (например, сценариев *.ps1
), так и ко всем встроенным командлетам, которые читают текст, в частности Get-Content
.
`n
- это LF, LINE FEED, U+000A
символ, используемый сам по себе в качестве новой строки на Unix -подобных платформах . `r`n
- это CRLF, символ новой строки sequence , состоящий из символа ВОЗВРАТ ЗАРЯДА (U+000D
), за которым сразу следует LF, используемый как символ новой строки в Windows.
`
используется выше, потому что это `
, backtick (формально известный как GRAVE ACCENT, U+0060
) , который служит экранирующим символом в PowerShel l, в отличие от многих других языков, где он равен \
( например, `n
в PowerShell соответствует \n
в C# и JavaScript, а `r`n
- \r\n
.
`
служит в качестве escape символ в PowerShell:
- внутри расширяемые строки (
"..."
; но не внутри '...'
, чье содержимое используется дословно ) нет - в без кавычек аргументы, передаваемые командам, где его основное назначение экранировать метасимволы (такие символы, как
;
, которые имеют функцию syntacti c), т.е. использовать их дословно ; например, Write-Host a`;b
) - См. концептуальные about_Special_Characters help topi c для получения дополнительной информации и список поддерживаемых escape-последовательностей .
Обратите внимание, что в контекстах regex (например, с помощью операторов -match
и -replace
), escape-последовательности на основе \
(например, \n
) могут все еще входят в игру, а именно, когда эти escape-последовательности интерпретируются механизмом регулярных выражений . NET , а не самим PowerShell (например, "a`nb" -replace '\n'
приводит к 'ab'
); см. концептуальные about_Regular_Expressions справки topi c.
Вкл. вывод , PowerShell использует нативную последовательность новой строки: `r`n
на Windows, `n
на Unix -подобных платформах.
Что касается ваш Speci c Вопросы :
Есть ли Автомат c преобразование из `n
в `r`n
?
В некотором смысле, да:
При сохранении в файл с помощью командлета создания текстового файла неявно используется платформа-нативная последовательность новой строки , как обсуждалось выше.
Следовательно, чтение a с Get-Content
(которое по умолчанию читает строку строка за строкой ) и сохранение этих строк обратно в файл с Set-Content
эффективно приведет к преобразованию исходных символов новой строки в нативные переводы платформы, если они исходят из соответствующего другого мира.
Обратите внимание, что, отдельно, кодировка символов может измениться , потому что когда строки считываются в память , информация о кодировке символов входного файла теряется, и командлеты, создающие текстовые файлы, такие как Set-Content
, применяют кодировку по умолчанию к выходным данным - см. этот ответ для фона информация.
Целевое преобразование в специфицированный c стиль новой строки, независимо от того, на какой платформе вы работаете , требует дополнительной работы.
почему вы должны использовать обратные косые черты (`
) вместо обратной косой черты (\
)?
* 12 45 *\
, поскольку escape-символ был бы плохим выбором для PowerShell, потому что \
используется в путях к файлам , учитывая, что \
служит (основным) разделитель пути к файловой системе в Windows, и учитывая, что передача путей к файлам в качестве аргументов является очень распространенным случаем в оболочках.
Необходимость \
- убрать эти разделители путей для устранения их неоднозначности начиная с \
, поскольку экранирующий символ (например, "C:\\Program Files\\PowerShell"
вместо "C:\Program Files\PowerShell"
) был бы неоправданным бременем (такое экранирование достаточно раздражает в таких языках программирования, как C# и JavaScript, хотя последние версии теперь предлагают альтернативные синтаксические формы, в которых экранирование не требуется).
Следовательно, PowerShell требовался другой escape-символ, и он установлен на `
, потому что:
редко в буквальном использовании; то есть вам редко придется самому бежать `
- как ``
- чтобы использовать его дословно .
хотя бы на английском языке sh клавиатуры, легко набирать.
Другие оболочки :
cmd.exe
тоже пришлось выбирать другой экранирующий символ и выбрал ^
, каретка (формально известный как CIRCUMFLEX ACCENT, U+005E
).
POSIX Подобные оболочки, такие как Bash, никогда не сталкивались с этой проблемой, потому что именно /
, а не \
, служит разделителем в Unix путях файловой системы; следовательно, эти оболочки используют \
в качестве escape-символа, как и большинство языков программирования.