Добавление новой строки (перенос строки) в сценарий Powershell - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть скрипт, который я запускаю в Powershell, и я хочу иметь возможность поместить строку в выводимый текстовый файл между именем сценария и самим содержимым скрипта.

В настоящее время, из приведенного ниже, строка $str_msg = $file,[System.IO.File]::ReadAllText($file.FullName) - это то, что мне нужно, но мне нужна строка, чтобы отделить $file и результат следующего выражения. Как я могу это сделать?

foreach ($file in [System.IO.Directory]::GetFiles($sqldir,"*.sql", 
  [System.IO.SearchOption]::AllDirectories))
{
  $file = [System.IO.FileInfo]::new($file);


  $Log.SetLogDir("");
  $str_msg = $file,[System.IO.File]::ReadAllText($file.FullName);


  $Log.AddMsg($str_msg);
  Write-Output $str_msg;


  # ...

}

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

ура к первому ответу

Backtick-r + backtick-n выполнит возврат каретки с новой строкой в ​​PS. Вы можете сделать Get-Content вашей переменной $ file как новую переменную массива и вставить возврат каретки по определенному индексу:

Файл примера: test123.txt

Если содержимое файла было таким:

line1
line2
line3

Сохраните содержимое в переменной массива, чтобы у вас были индексы

[Array]$fileContent = Get-Content C:\path\to\test123.txt

Чтобы добавить возврат каретки между строкой 2 и строкой 3:

$fileContent2 = $fileContent[0..1] + "`r`n" + $fileContent[2]

Затем выведите новый файл:

$fileContent2 | Out-File -FilePath C:\path\to\newfile.txt

Надеюсь, что этот альтернативный подход поможет будущим искателям ответов

0 голосов
/ 02 ноября 2018
  • $str_msg = $file,[System.IO.File]::ReadAllText($file.FullName) не создает строку , он создает 2-элементный массив ([object[]]), состоящий из $file [System.IO.FileInfo] экземпляр и строка с содержимым этого файла.

  • Предположительно, метод .AddMsg() ожидает одну строку, поэтому PowerShell преобразует в массив массив, чтобы преобразовать его в одну строку; PowerShell переводит массив в массив , объединяя элементы с одним пробелом в качестве разделителя по умолчанию; например.: [string] (1, 2) урожайность '1 2'.

Поэтому лучше всего составить $str_msg в виде строки для начала с явным переводом строки в качестве разделителя , например ::101035*

$strMsg = "$file`r`n$([System.IO.File]::ReadAllText($file.FullName))"

Обратите внимание на использование escape-последовательности "`r`n" для создания CRLF, специфичной для Windows последовательности новой строки; на Unix-подобных платформах вы бы использовали "`n" (LF).

.NET предлагает кроссплатформенную абстракцию, [Environment]::NewLine, которая возвращает подходящую для платформы последовательность новой строки (которую вы можете альтернативно встроить как $([Environment]::NewLine) в "...").

Альтернативой интерполяции строки является использование -f, оператора форматирования строки, основанного на методе .NET String.Format():

$strMsg = '{0}{1}{2}' -f $file, 
                        [Environment]::NewLine, 
                        [System.IO.File]::ReadAllText($file.FullName)
0 голосов
/ 02 ноября 2018

Вам необходимо использовать специальный символ powershell для возврата каретки , который является `` r ".

Используйте это, чтобы добавить возврат каретки в вашей строке:

$str_msg = $file,"`r",[System.IO.File]::ReadAllText($file.FullName);

Проверьте эту документацию , чтобы получить более подробную информацию о специальных символах Poewershell.

...