Вложенный цикл foreach () с content.replace не устанавливает контент (или добавляет контент), как ожидалось - PullRequest
0 голосов
/ 11 октября 2018

У меня есть следующий скрипт Powershell с двумя вложенными циклами foreach.Сценарий должен захватывать содержимое из простого SQL-файла, добавлять префиксы к именам таблиц и записывать новые SQL-файлы на основе префиксов / имен учеников.

$content = Get-Content "[PATH_FILE].sql"
$students = @('18adadam','18bebert','18dadavi')
# $students = Get-Content "[PATH_FILE].txt"
$tables = @('image','post','user')

foreach ($student in $students) {
  foreach ($table in $tables) {
    $tablename = $student + '_' + $table
    'Table name: ' + $tablename
    $content = $content.Replace("TABLE ``$table``","TABLE ``$tablename``") 
  } 
  $content | Set-Content ("$student.sql")
  'Content: '+ $content
}

Файлы создаются какожидается:

  • 18adadam.sql
  • 18bebert.sql
  • 18dadavi.sql

Вывод из внутренней переменной $ tablenameцикл в порядке:

Имя таблицы: 18adadam_image

Имя таблицы: 18adadam_post

Имя таблицы: 18adadam_user

Имя таблицы: 18bebert_image

Имя таблицы: 18bebert_post

Имя таблицы: 18bebert_user

Имя таблицы: 18dadavi_image

Имя таблицы: 18dadavi_post

Имя таблицы: 18dadavi_user

Но содержимое, записанное в файлы (и в консоль), содержит только исправленные таблицы для первого ученика (18adadam):

--
-- Table structure for table `image`
--

CREATE TABLE `18adadam_image` (
  `id` int(11) NOT NULL,
  `filename` varchar(255) NOT NULL,
  `description` text NOT NULL,
  `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `postId` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Table structure for table `post`
--

CREATE TABLE `18adadam_post` (
  `id` int(11) NOT NULL,
  `title` varchar(255) NOT NULL,
  `content` text NOT NULL,
  `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `userId` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Изначально строка замены содержимого строки выглядела так:

$content = $content.Replace("TABLE ``$table``","TABLE ``$student" + "_" + "$table``")

и я был обеспокоен тем, что КонкатЯ как-то облажался с записью содержимого, поэтому я изменил его на одну переменную для имени таблицы.

$tablename = $student + '_' + $table
$content = $content.Replace("TABLE ``$table``","TABLE ``$tablename``") 

Я добавил

'Table name: ' + $tablename

и

'Content: '+ $content

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

Я также пытался увидеть, изменится ли что-либо при изменении вывода на один файл следующим образом:

  $content | Add-Content ("[PATH_FILE]_2.sql")

Все, что было сделано, как и ожидалось, было создать файл с правильным sql для 18adadam, повторенный три раза.

1 Ответ

0 голосов
/ 11 октября 2018

2-е $content.Replace( не найдет исходное значение, поскольку оно изменяется в $ content.
Сохраните изменения в другой переменной.

## Q:\Test\2018\10\11\SO_52758908.ps1
$content = Get-Content ".\template.sql"
$students = @('18adadam','18bebert','18dadavi')
# $students = Get-Content "[PATH_FILE].txt"
$tables = @('image','post','user')

foreach ($student in $students) {
  $Newcontent = $content
  foreach ($table in $tables) {
    $tablename = "{0}_{1}" -f $student,$table
    'Table name: ' + $tablename
    $Newcontent = $Newcontent.Replace("TABLE ``$table``","TABLE ``$tablename``")
  }
  $Newcontent | Set-Content ("$student.sql")
  'Content: '
  $Newcontent
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...