Get-content скопируйте указанную c строку и вставьте содержимое в другой файл в указанную c строку - PullRequest
1 голос
/ 25 февраля 2020

Мне нужно скопировать строку 11 из файла Data1.txt и скопировать содержимое строки 11 в файл Data2.txt в строку 11 без перезаписи всего файла.

Это перезаписывает файл Data2 только строкой 11, а не убедитесь, как вставить содержимое только в строку 11.

$Content= Get-Content -Path C:\Desktop\Data1.txt
$Content= $Content[10]
Set-Content -Path C:\Desktop\Data2.txt -Value $Content

Это заменяет файл Data2 содержимым Data1

$Content= 'C:\Desktop\Data1.txt'
(Get-Content C:\Desktop\Data2.txt) -replace 'condition=$' | Set-Content $Content

Ответы [ 3 ]

1 голос
/ 25 февраля 2020

Если вы хотите перезаписать строку 11 в файле Data2.txt со строкой 11, считанной из файла Data1.txt, вы можете go с полезным ответом DevX .

Однако, при этом весь файл Data1.txt считывается в памяти, и, не зная, насколько велик этот файл, может быть более дружественный подход к памяти с использованием параметра TotalCount:

$copyLineFrom = 'C:\Desktop\Data1.txt'
$fileToUpdate = 'C:\Desktop\Data2.txt'
# get line 11 from Data1.txt
$line11 = Get-Content -Path $copyLineFrom -TotalCount 11 | Select-Object -Last 1
$data   = Get-Content -Path $fileToUpdate
# replace line 11 (index 10)
if ($data.Count -ge 11) { $data[10] = $line11 }
$data | Set-Content -Path $fileToUpdate

Если вы хотите вставить строку 11 из файла Data1.txt в файл Data2.txt в позиции 11 (и тем самым переместить все строки ниже этой 1 позиции вниз), я бы предложил использовать Перечислите объект и используйте его Insert() метод:

$copyLineFrom = 'C:\Desktop\Data1.txt'
$fileToUpdate = 'C:\Desktop\Data2.txt'
# get line 11 from Data1.txt
$lineToInsert = Get-Content -Path $copyLineFrom -TotalCount 11 | Select-Object -Last 1

# read Data2.txt in a List object
$data = [System.Collections.Generic.List[string]]::new([string[]](Get-Content -Path $fileToUpdate))
# insert the line at position 11 (index 10)
if ($data.Count -ge 11) { $data.Insert(10, $lineToInsert) }
$data | Set-Content -Path $fileToUpdate
1 голос
/ 25 февраля 2020

Вам просто нужно прочитать содержимое Data2.txt, а затем установить строку 11 в строку 11 данных 1

$Content1= Get-Content -Path C:\Desktop\Data1.txt
$Content2= Get-Content -Path C:\Desktop\Data2.txt
$Content2[10] = $Content1[10]
Set-Content -Path C:\Desktop\Data2.txt -Value $Content2

. Это сделает базовую c работу за вас, но это предполагается, что у вас есть как минимум 11 строк в обоих файлах. Ваш другой подход не в моей компетенции, поэтому кто-то здесь может помочь вам в этом.

0 голосов
/ 25 февраля 2020

Попробуйте:

$Content= Get-Content -Path C:\Desktop\Data1.txt
$Contentp = $Content[10]
$Line = 0
Get-Content C:\Desktop\Data2.txt | ForEach {
  $Line++
  If ($Line -eq 11) {
    $Contentp
  }
  Else {
    $_
  }
} | Set-Content C:\Data\Data2.txt

Set-Content перезаписывает текстовое содержимое. Здесь мы читаем каждую строку файла, используя счетчик приращений ForEach l oop. Когда строка равна 11, мы помещаем строку для вставки. Иначе оригинальная линия наклеена. Затем новый контент передается в data2.txt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...