У меня есть следующий скрипт 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, повторенный три раза.