Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/16: Рейтинг темы: голосов - 16, средняя оценка - 4.94
 Аватар для DjonyCooper
10 / 7 / 4
Регистрация: 28.05.2021
Сообщений: 136

Массовая подмена строки из одного файла в других Powershell

18.08.2021, 17:18. Показов 3494. Ответов 19

Студворк — интернет-сервис помощи студентам
Привет друзья! Появился такой вопрос, пытаюсь скопировать одну строку из нужного мне файла в файлах, с разными именами в папке. При чем не абы какую, а конкретную строку меняю:

PowerShell
1
2
3
4
5
6
7
8
9
#Копирование нужного текста и переименование файла
$copyLineFrom = 'C:\Users\IvanMB\Desktop\name.ps1'
$path = "C:\Users\IvanMB\Desktop\1"
$line1 = Get-Content -Path $copyLineFrom -TotalCount 1 
$file = Get-ChildItem -Path $path
$fileToUpdate=$file.FullName
$data   = Get-Content -Path $fileToUpdate
if ($data.Count -ge 1) { $data[3] = $line1 }
$data | Set-Content -Path $fileToUpdate
Вот код на сейчас, он копирует нужную мне строку и меняет ее в том месте где мне надо, но! после выполнения скрипта, тестируемые файлы 1 и 2 меняются, файл 1, копирует в себя инфу из второго файла, при этом в нем меняется нужная мне строка, а файл 2, содержимое по ощущениям заменяется на содержимое из файла 1. Есть идее что не так?

0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.08.2021, 17:18
Ответы с готовыми решениями:

Подмена одного файла другим
Здравствуйте! В общем есть 2 файла settings.con и settings.con.backup оба находятся в одной папке. Можно ли сделать bat-файл, чтобы он...

Подмена файла hosts, подмена стартовой страницы, обращение utorrent к подозрительным адресам
Добрый день! Попал в руки ноутбук со следующей проблемой: браузер не открывал доступ к сайтам и поисковым системам, сообщая о использовании...

Копирование данных из одного файла в несколько других
Всем доброго времени суток! Помогите с вопросом пожалуйста. есть несколько файлов (прайсов) в папке с разными именами (AA1_01, BS4_03,...

19
Покинул форум
3701 / 1484 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
18.08.2021, 18:13
Цитата Сообщение от DjonyCooper
пытаюсь скопировать одну строку из нужного мне файла в файлах
Это клингонский?
Цитата Сообщение от DjonyCooper
Есть идее что не так?
Есть: для начала перейдите на русскую мову.
0
 Аватар для DjonyCooper
10 / 7 / 4
Регистрация: 28.05.2021
Сообщений: 136
18.08.2021, 18:38  [ТС]
Файл name.ps1 содержит 1 строку с данными 123456789. Нужно перенести эту строку, из файла name.ps1 в файлы, расположенные в папке: C:\Users\IvanMB\Desktop\1. В папке 1 находятся 2 или более файлов. Пытался перенести 1 строку данных из файла name ps1 в директорию C:\Users\IvanMB\Desktop\1 и заменить во всех, находящихся там, файлах, строку 4. Но вышло то, что вышло см. скриншоты.
0
 Аватар для alhaos
1929 / 545 / 154
Регистрация: 20.02.2019
Сообщений: 2,664
Записей в блоге: 65
18.08.2021, 18:41
Цитата Сообщение от DjonyCooper Посмотреть сообщение
Есть идее что не так?
предполагаю в формулировке задачи
0
 Аватар для volodin661
6799 / 2297 / 349
Регистрация: 10.12.2013
Сообщений: 7,924
18.08.2021, 18:42
Цитата Сообщение от DjonyCooper Посмотреть сообщение
Но вышло то, что вышло см. скриншоты.
смотрим на них, не отрываясь.
0
 Аватар для DjonyCooper
10 / 7 / 4
Регистрация: 28.05.2021
Сообщений: 136
18.08.2021, 18:43  [ТС]
Этот скрипт, на один файл, если копировать например в самый свежесозданный файл, работает отлично, а на массив не выходит переделать.
0
 Аватар для alhaos
1929 / 545 / 154
Регистрация: 20.02.2019
Сообщений: 2,664
Записей в блоге: 65
18.08.2021, 18:44
DjonyCooper, могу порекомендовать использовать входные параметры
0
 Аватар для volodin661
6799 / 2297 / 349
Регистрация: 10.12.2013
Сообщений: 7,924
18.08.2021, 18:45
по-моему, маловато переименований и переносов файлов, строчек, папок и тапок.
я бы усилил. пока ты ешё молот.
а то так и жизнь пройдёт.
0
 Аватар для DjonyCooper
10 / 7 / 4
Регистрация: 28.05.2021
Сообщений: 136
18.08.2021, 18:51  [ТС]
Ты из запоя все не как не выйдешь что ли? Что за бред пишешь?
0
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
18.08.2021, 20:43
Лучший ответ Сообщение было отмечено DjonyCooper как решение

Решение

PowerShell
1
2
3
4
5
6
7
8
9
10
$fileIn = gc 'C:\name.txt'
# Берем 3-ю строку из файла выше и запоминаем в переменную
$Line3 = $fileIn[2]
 
$fileAll = gci 'C:\papka'
$fileAll|% {
  $fileOut = gc $_
  # Меняем в каждом файле из папки 'C:\papka' 3-ю строку на запомненную в переменной
  $fileOut -Replace $fileOut[2], $Line3|Set-Content $_
}
1
 Аватар для DjonyCooper
10 / 7 / 4
Регистрация: 28.05.2021
Сообщений: 136
19.08.2021, 10:58  [ТС]
Не сработал, выдает ошибку:

gc : Cannot find path 'C:\WINDOWS\system32\file2.txt' because it does not exist.
At C:\Users\IvanMB\Desktop\1.ps1:6 char:14
+ $fileOut = gc $_
+ ~~~~~
+ CategoryInfo : ObjectNotFound: (C:\WINDOWS\system32\file2.txt:String) [Get-Content], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Comman ds.GetContentCommand

Cannot index into a null array.
At C:\Users\IvanMB\Desktop\1.ps1:7 char:3
+ $fileOut -Replace $fileOut[2], $Line3|Set-Content $_
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: ( [], RuntimeException
+ FullyQualifiedErrorId : NullArray

PowerShell
1
2
3
4
5
6
7
8
$fileIn = gc 'C:\Users\IvanMB\Desktop\name.ps1'
# Берем 3-ю строку из файла выше и запоминаем в переменную
$Line3 = $fileIn[2]
$fileAll = gc "C:\Users\IvanMB\Desktop\1"
$fileAll| % {
  $fileOut = gc $_
  $fileOut -Replace $fileOut[2], $Line3|Set-Content $_
  }
0
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
19.08.2021, 12:47
Цитата Сообщение от alpap Посмотреть сообщение
$fileAll = gci 'C:\papka'
? ...
Цитата Сообщение от DjonyCooper Посмотреть сообщение
$fileAll = gc "C:\Users\IvanMB\Desktop\1"
Добавлено через 13 минут
можно без предисловий
PowerShell
1
2
3
4
5
6
7
$fileIn  = gc 'C:\name.txt'
$fileAll = gci 'C:\papka'
 
Switch ($fileAll) {
  {(gc $_)[2]} {(gc $_) -Replace (gc $_)[2], $fileIn[2]|Set-Content $_}
  Default {'Нет 3-й строки в файле:'+$_}
}
0
 Аватар для DjonyCooper
10 / 7 / 4
Регистрация: 28.05.2021
Сообщений: 136
19.08.2021, 12:49  [ТС]
Это я уже пробовал менять что то, с gci тоже самое пишет в ошибке

gci : Cannot find path 'C:\WINDOWS\system32\file2.txt' because it does not exist.
At C:\Users\IvanMB\Desktop\1.ps1:6 char:14
+ $fileOut = gci $_
+ ~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\WINDOWS\system32\file2.txt:String) [Get-ChildItem], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Comman ds.GetChildItemCommand

Cannot index into a null array.
At C:\Users\IvanMB\Desktop\1.ps1:7 char:3
+ $fileOut -Replace $fileOut[2], $Line3|Set-Content $_
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: ( [], RuntimeException
+ FullyQualifiedErrorId : NullArray
0
 Аватар для DjonyCooper
10 / 7 / 4
Регистрация: 28.05.2021
Сообщений: 136
19.08.2021, 13:01  [ТС]


На вариант без предисловий тоже ругается
0
Покинул форум
3701 / 1484 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
19.08.2021, 14:01
Для чего вам запускать сценарий из системной папки? Второе, в ps v5 с "автоматическими" переменными нужно быть очень аккуратным: шаг влево, шаг вправо, - трейсбек и хост захлопнется.
1
 Аватар для DjonyCooper
10 / 7 / 4
Регистрация: 28.05.2021
Сообщений: 136
19.08.2021, 14:03  [ТС]
Спасибо! Нашел загвоздку, добавив .FullName после $fileAll все заработало!

$fileIn = gc "C:\Users\IvanMB\Desktop\name.ps1"
# Берем 3-ю строку из файла выше и запоминаем в переменную
$Line3 = $fileIn[2]

$fileAll = gci "C:\Users\IvanMB\Desktop\Papka"
$fileAll.FullName| %{
$fileOut = gc $_
# Меняем в каждом файле из папки 'C:\papka' 3-ю строку на запомненную в переменной
$fileOut -Replace $fileOut[2], $Line3|Set-Content $_
}
0
 Аватар для DjonyCooper
10 / 7 / 4
Регистрация: 28.05.2021
Сообщений: 136
19.08.2021, 14:53  [ТС]
Рано обрадовался, скрипт рабочий, безусловно, но работает только с маленькими файлами, не понимаю как так, но когда подставил его на замену строк к большому скрипту получил это:


Поковырявшись понял, что у меня в скрипте, в месте куда нужно вставлять как раз таки строчку пробелы, копируя в место где пробел, все данные в конечном файле по какой то причине меняются. Убрал пробелы все заработало, но ... по хорошему мне нужны эти пробелы, буду думать как исправить.
p.s скрипт, который показывал первым хорошо работает с пробелами, но не работает с массой файлов, только с одним. А этот выходит работает с массой, но не до конца так, как нужно.
Миниатюры
Массовая подмена строки из одного файла в других Powershell  
0
㊙️
 Аватар для Fors1k
1316 / 244 / 57
Регистрация: 10.08.2018
Сообщений: 574
19.08.2021, 16:40
Лучший ответ Сообщение было отмечено DjonyCooper как решение

Решение

Цитата Сообщение от DjonyCooper Посмотреть сообщение
Файл name.ps1 содержит 1 строку с данными 123456789
в папке: C:\Users\IvanMB\Desktop\1 заменить во всех, находящихся там, файлах, строку 4
PowerShell
1
2
3
4
5
6
7
8
cls
.{
    $fileIn  = "C:\Users\IvanMB\Desktop\name.ps1"
    $folder  = "C:\Users\IvanMB\Desktop\1"
    $lineNum = 4
}
 
(gci $folder).FullName|%{$l=gc $fileIn}{$f=gc $_;$f[$linenum-1]=$l;$f|out-file $_}
Добавлено через 5 минут
Цитата Сообщение от alpap Посмотреть сообщение
Меняем в каждом файле из папки 'C:\papka' 3-ю строку
Этот код меняет не третью строку, а всё, что в любом месте файла совпадет с третьей строкой,
или вызывает ошибку: "Недопустимый шаблон регулярного выражения".
2
 Аватар для alhaos
1929 / 545 / 154
Регистрация: 20.02.2019
Сообщений: 2,664
Записей в блоге: 65
20.08.2021, 09:05
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using namespace System.IO
using namespace System.Text
param (
    $fileIn  = "C:\tmp\АААААААААА_ББББББББББ_333333.xml",
    $folder  = "C:\tmp\001",
    $lineNum = 4
)
 
$streamReader = [StreamReader]::new($fileIn)
for ($i = 1; $i -le 4; $i++){
    $line4 = $streamReader.ReadLine()
}
$streamReader.Close()
 
[Directory]::GetFiles($folder).ForEach{
    $i = 1
    $streamReader = [StreamReader]::new($_)
    $stringBuilder = [StringBuilder]::new()
    while ($line = $streamReader.ReadLine()){
        $line = ($i++) -eq $lineNum ? $line4 : $line
        $null = $stringBuilder.AppendLine($line)
    }
    $streamReader.Close()
    [file]::WriteAllText($_, $stringBuilder.ToString())
}
1
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
20.08.2021, 10:18
Переделал
Спасибо за подсказку Fors1k,!

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
$fileIn   = 'C:\name.txt'
$folder   = 'C:\papka'
$lineNIn  = 3 # Берем 3-ю строку, на которую будем менять
$LineNOut = 3 # Номер строки в каждом файле, которую будем заменять
 
(gci $folder).FullName|% {
  if ($_) {
    $fileOut = gc $_
    if ($fileOut[$LineNOut-1] -ne $Null) {$fileOut[$LineNOut-1] = (gc $fileIn)[$lineNIn-1]}
  }
  $fileOut|Out-File $_
}
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.08.2021, 10:18
Помогаю со студенческими работами здесь

Powershell импорт последней строки из csv файла
Добрый день. Имею файл csv, который динамически обновляется (каждую минуту добавляется последняя строка с данными) Задача получать...

На основе содержимого одного текстового файла создать два других
Граждане, прошу помощи. Есть текстовик с таким содержанием: Нужно сделать из него два текстовых файла с таким содержанием: и ...

Макрос для копирования формул из одного файла в 1000 других
Доброе время суток! Возникла проблема: у меня имеются файлы формата csres. Один из 1000 файлов я открыл в формате excel с...

Переписать целые числа одного файла в два других по четности и нечетности
Здравствуйте. Имеется типизированный файл, элементами которого являются целые числа. Четные числа файла записать во второй файл, а...

Создание множества копий одного файла с именами, взятыми от других файлов
Есть аудиофайл в папке "F:\1\name.mp3" Есть папка "F:\2". В ней лежит множество файлов с разными именами но одним расширением...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru