Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 05.09.2021
Сообщений: 10

Создание папок и перемещение в них файлов (снова)

06.09.2021, 01:35. Показов 4525. Ответов 27

Студворк — интернет-сервис помощи студентам
Господа, день добрый.

У меня задача очень похожая на эту, но я в PowerShell вообще ни бум-бум. Пробежался по статейкам и хелпу - общие моменты вполне понятны, а вот осилить разбор имени файла у меня пока что не вышло.

Задача такова: разобрать файлы проекта по папкам. Файлы бывают "исходниками" - dwg, docx, xlsx и "результатом" - pdf.
Варианты имён файлов таковы:
Кликните здесь для просмотра всего текста
d:\test\РК-РД-ЧС-01-А2-К-00.pdf
d:\test\РК-РД-ЧС-01-А2-С-00.docx
d:\test\РК-РД-ЧС-01-А2-С-00.pdf
d:\test\РК-РД-ЧС-01-В2-003, 004-00.dwg
d:\test\РК-РД-ЧС-01-КВД-002-00.dwg
d:\test\РК-РД-ЧС-01-С-003, 004-00.dwg
d:\test\РК-РД-ЧС-02-А2-001-00.docx
d:\test\РК-РД-ЧС-02-А2-001-00.docx
d:\test\РК-РД-ЧС-02-А2-003, 004-00.dwg
d:\test\РК-РД-ЧС-02-А2-К-00.docx
d:\test\РК-РД-ЧС-04-А3-003, 004-00.dwg
d:\test\РК-РД-ЧС-04-В1-003-00.dwg
d:\test\РК-РД-ЧС-04-С-002-00.dwg

Названия файлов имеют следующую структуру: AA-BB-CC-DD-EE-FFF-GG.pdf
Задача первая (промежуточная) - для файлов с именами вида "*003, 004*" (цифры не обязательно могут быть такими) получить 2 одинаковых копии файла с именами "003" и "004".
Задача вторая - разложить файлы по папкам проекта, надо взять имя файла от начала до 5го тире. В каждой папке проекта должно оказаться две папки - native и pdf, одна с "исходными" файлами, вторая с "результатами".
Ну и до кучи все получившиеся файлы проекта собрать в одну папочку с названием равным текущей дате.

Так-то общий алгоритм действий мне понятен, и отдельные этапы с перемещениями файликов вроде я могу реализовать, а вот взаимодействие с командой Split меня просто в ступор вгоняет.
Подтолкните в правильном направлении.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.09.2021, 01:35
Ответы с готовыми решениями:

Создание папок и перемещение в них файлов
Добрый день. Есть папка с файлами типа 1_234_567.pdf 1_234_567АБ.pdf 1_234_567ВГ.pdf 1_234_567ГД_V0.pdf ...

Создание папок и перемещение в них файлов по списку
Доброго времени суток! Собственно, вопрос в следующем: Имеется список файлов текущего каталога вида 1.jpg,2.jpg 3.jpg ...

Создание папок по имени файлов и перемещение этих файлов в созданные папки
Господа, прошу помощи. В батниках полный ноль Имеется папка с множеством файлов, скриншот во вложении Эти файлы относятся к...

27
0 / 0 / 0
Регистрация: 05.09.2021
Сообщений: 10
07.09.2021, 16:09  [ТС]
Студворк — интернет-сервис помощи студентам
У себя обновился, надо бы тогда и старый powershell прибить, чтобы не смущал.
А вот чтобы по всем своим проектировщикам не бегать и каждому не обновлять - попробую модифицировать.

Как задать ему каталог ".", чтобы он текущим пользовался?

Добавлено через 22 минуты
alhaos, скрипт работает, но подлянку кинули с другой стороны

Вчера пришла команда изменить шифр проекта для одного здания, и теперь вместо
РК-РД-ЧС-01-КВД-001-00.docx
у меня
РК-РД-ЧС-К-001-00.docx
Что ломает всё стройную систему.
Собственно конкретно на это здание можно и забить, для него будет всего один проект, так что руками отсортироваьт нет никаких проблем.

Пытаюсь сделать эксепшен для этого случая и не понимаю почему он не работает:
PowerShell
1
2
3
4
5
[Directory]::GetFiles($sourceDirectory).ForEach{
    #проверяем чтобы не зацепить лишние файлы
    if (($_.extention -eq ".pdf", ".dwg", ".xls", ".xlsx", ".doc", ".docx") -and ($_.sourceFile -notcontains "ЧС-К-"))
    {$sourceFiles.Add([TargetFile]::new($_))}
}
0
2807 / 505 / 121
Регистрация: 26.09.2020
Сообщений: 959
Записей в блоге: 5
07.09.2021, 18:18
Цитата Сообщение от sting26 Посмотреть сообщение
Пытаюсь сделать эксепшен для этого случая и не понимаю почему он не работает:
потому, что в слове из трех букав, сразу 4 ошибки, шютка
[Directory]::GetFiles возвращает строку, а у строки нету полей. Работать надо как со стркой.
$_ (строка) -match (содержит) ".pdf|.dwg|.xls|.xlsx|.doc|.docx" знак | (вертикальная черта) тут означает ИЛИ
PowerShell
1
2
3
4
[Directory]::GetFiles($sourceDirectory).ForEach{
    #проверяем чтобы не зацепить лишние файлы
    if (($_ -match ".pdf|.dwg|.xls|.xlsx|.doc|.docx") -and ($_ -notmatch "ЧС-K")) { $sourceFiles.Add([TargetFile]::new($_)) }
}
Добавлено через 5 минут
alhaos, 16
Узрел демонстрационное НЕиспользование функций powershell
0
0 / 0 / 0
Регистрация: 05.09.2021
Сообщений: 10
07.09.2021, 18:36  [ТС]
Вот за это я не пошел в программирование - вот эти вот 100500 способов по разному сделать одно и то же, брр, мама роди меня обратно!

Затестил, всё равно скрипт хватает неправильные файлы:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
prefix         : РК-РД-ЧС-К-004
copiesSuffixes : {00.pdf}
extention      : .pdf
sourceFile     : d:\test\РК-РД-ЧС-К-004-00.pdf
destFiles      : {РК-РД-ЧС-К-004-00.pdf-00.pdf}
 
prefix         : РК-РД-ЧС-К-005
copiesSuffixes : {00.dwg}
extention      : .dwg
sourceFile     : d:\test\РК-РД-ЧС-К-005-00.dwg
destFiles      : {РК-РД-ЧС-К-005-00.dwg-00.dwg}
 
prefix         : РК-РД-ЧС-06-В1
copiesSuffixes : {004}
extention      : .pdf
sourceFile     : d:\test\РК-РД-ЧС-06-В1-004-00.pdf
destFiles      : {РК-РД-ЧС-06-В1-004-00.pdf}
0
2807 / 505 / 121
Регистрация: 26.09.2020
Сообщений: 959
Записей в блоге: 5
07.09.2021, 19:07
sting26, по выводу, не всегда видно, что вы там запускали…
атак
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
26
27
28
29
30
31
32
33
34
#Requires -Version 7
$sourceDirectory = "d:\test"
 
class TargetFile {
    [string]$prefix
    [string[]]$copiesSuffixes
    [string]$extention
    [System.IO.FileInfo]$sourceFile
    [System.IO.FileInfo[]]$destFiles
 
    TargetFile ([string]$fullFileName){
        $filename = [System.IO.Path]::GetFileName($fullFileName)
        [string[]]$chanks = $filename.Split("-")
        $this.prefix = [string]::Join("-", $chanks[0..4])
        $this.copiesSuffixes = $chanks[5] -split ",\s*"
        $this.extention = [System.IO.Path]::GetExtension($filename)
        $this.sourceFile = $fullFileName
        $this.destFiles = $this.copiesSuffixes.ForEach{
            [System.IO.FileInfo][string]::join("-", $this.prefix, $_, $chanks[-1])
        }
    }
}
 
$sourceFiles = [System.Collections.Generic.list[TargetFile]]::new()
 
[System.IO.Directory]::GetFiles($sourceDirectory).ForEach{
    #проверяем чтобы не зацепить лишние файлы
    if (($_ -match ".pdf|.dwg|.xls|.xlsx|.doc|.docx") -and ($_ -notmatch "ЧС-K"))
    {
        $sourceFiles.Add([TargetFile]::new($_))
    }
}
 
$sourceFiles
0
0 / 0 / 0
Регистрация: 05.09.2021
Сообщений: 10
07.09.2021, 19:34  [ТС]
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
prefix         : РК-РД-ЧС-К-005
copiesSuffixes : {00.dwg}
extention      : .dwg
sourceFile     : d:\test\РК-РД-ЧС-К-005-00.dwg
destFiles      : {РК-РД-ЧС-К-005-00.dwg-00.dwg}
 
prefix         : РК-РД-ЧС-К-С
copiesSuffixes : {00.pdf}
extention      : .pdf
sourceFile     : d:\test\РК-РД-ЧС-К-С-00.pdf
destFiles      : {РК-РД-ЧС-К-С-00.pdf-00.pdf}
 
prefix         : РК-РД-ЧС-М-А1
copiesSuffixes : {001}
extention      : .docx
sourceFile     : d:\test\РК-РД-ЧС-М-А1-001-00.docx
destFiles      : {РК-РД-ЧС-М-А1-001-00.docx}
 
prefix         : РК-РД-ЧС-05-В1
copiesSuffixes : {001}
extention      : .docx
sourceFile     : d:\test\РК-РД-ЧС-05-В1-001-00.docx
destFiles      : {РК-РД-ЧС-05-В1-001-00.docx}
Добавлено через 2 минуты
В список $sourceFiles продолжает попадать то, что туда попадать не должно.
Уточню на всякий случай - в имени файла все символы это кириллица.

Добавлено через 2 минуты
Ха, кажется починил.

Вот так протестил:
PowerShell
1
2
3
4
5
6
7
8
[System.IO.Directory]::GetFiles($sourceDirectory).ForEach{
    #проверяем чтобы не зацепить лишние файлы
    #if (($_ -match ".pdf|.dwg|.xls|.xlsx|.doc|.docx") -and ($_ -notmatch "ЧС-K"))
    if  ($_ -match "ЧС-К")
    {
        $sourceFiles.Add([TargetFile]::new($_))
    }
}
И повторно ввёл кириллицу.

Добавлено через 5 минут
Чтож, похоже это успех!

Итоговый код:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#Requires -Version 7
using namespace System.IO
using namespace System.Collections.Generic
using namespace System.Linq
 
param (
    $sourceDirectory = ".",
    $targetDirectory = "."
)
 
$numNative = 0
$numPDF = 0
$DebugPreference = "continue"
 
class TargetFile {
    [string]$prefix
    [string[]]$copiesSuffixes
    [string]$extention
    [fileinfo]$sourceFile
    [fileinfo[]]$destFiles
 
    TargetFile ([string]$fullFileName){
        $filename = [path]::GetFileName($fullFileName)
        [string[]]$chanks = $filename.Split("-")
        $this.prefix = [string]::Join("-", $chanks[0..4])
        $this.copiesSuffixes = $chanks[5] -split ",\s*"
        $this.extention = [Path]::GetExtension($filename)
        $this.sourceFile = $fullFileName
        $this.destFiles = $this.copiesSuffixes.ForEach{
            [FileInfo][string]::join("-", $this.prefix, $_, $chanks[-1])
        }
    }
}[list[TargetFile]]$sourceFiles =[list[TargetFile]]::new();
 
[System.IO.Directory]::GetFiles($sourceDirectory).ForEach{
    #проверяем чтобы не зацепить лишние файлы
    if (($_ -match ".pdf|.dwg|.xls|.xlsx|.doc|.docx") -and ($_ -notmatch "ЧС-К"))
    {
        $sourceFiles.Add([TargetFile]::new($_))
    }
}
 
#[Directory]::GetFiles($sourceDirectory).ForEach{
#   if (($_ -match ".pdf|.dwg|.xls|.xlsx|.doc|.docx") -and ($_ -notmatch "ЧС-K")) {$sourceFiles.Add([TargetFile]::new($_))}
#}
 
$sourceFiles 
 
$currentDateTargetDirectory = [Path]::Join($targetDirectory, [datetime]::Today.ToString("yyyy-MM-dd"))
if (![Directory]::Exists($currentDateTargetDirectory)){[Directory]::CreateDirectory($currentDateTargetDirectory)}
 
[Enumerable]::GroupBy($sourceFiles, [func[TargetFile, string]]{$Args[0].prefix}).ToArray().ForEach{
    $key = $_.key
    $currentKeyDirectory = [path]::Join($currentDateTargetDirectory, $key)
    if (![Directory]::Exists($currentKeyDirectory)){$null = [Directory]::CreateDirectory($currentKeyDirectory)}
 
    $currentKeyNativeDirectory = [path]::Join($currentKeyDirectory, "Native")
    if (![Directory]::Exists($currentKeyNativeDirectory)){$null = [Directory]::CreateDirectory($currentKeyNativeDirectory)}
 
    $currentKeyPdfDirectory = [path]::Join($currentKeyDirectory, "Pdf")
    if (![Directory]::Exists($currentKeyPdfDirectory)){$null = [Directory]::CreateDirectory($currentKeyPdfDirectory)}
 
    $sourceFiles.Where{$_.prefix -eq $key}.foreach{
        $extention = $_.extention
        
        $sourceFile = $_.sourceFile
        $_.destFiles.ForEach{
            $destinationFilename = if ($extention -eq ".pdf") 
            {[path]::Join($currentKeyPdfDirectory, $_)
            $numNative++} 
            else 
            {[path]::Join($currentKeyNativeDirectory, $_)
            $numPDF++}
            [file]::Copy($sourceFile, $destinationFilename)
        }
        [file]::Delete($_.sourceFile)
    }
}
 
"Всего исходных файлов - "+$NumNative
"Всего PDF файлов - "+$numPDF
 
Read-Host -Prompt "Press Enter to exit"
Огромное спасибо за помощь!
0
 Аватар для alhaos
1934 / 549 / 155
Регистрация: 20.02.2019
Сообщений: 2,675
Записей в блоге: 77
07.09.2021, 19:37
PowerShell
1
2
$this.prefix = [string]::Join("-", $chanks[0..3])
$this.copiesSuffixes = $chanks[4] -split ",\s*"
так попробуй

Добавлено через 2 минуты
еще один франкенскипт, it's alive!!! Ha ha ha!!!
0
0 / 0 / 0
Регистрация: 05.09.2021
Сообщений: 10
07.09.2021, 19:53  [ТС]
Цитата Сообщение от alhaos Посмотреть сообщение
так попробуй
Ненене, тогда в "код проекта" попадает слишком мало символов, отсекается пятая секция в названии файла (а там код здания) и они в общую кучу падают.

Добавлено через 1 минуту
Код с комментами, специально для таких как я

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#Requires -Version 7
 
#скрипт позволяет разобрать файлы проекта типа РК-РД-ЧС-02-А2-003.dwg по папкам для выгрузки
#запускать скрипт из папки, где в корне лежать все файлы, включая pdf  
using namespace System.IO
using namespace System.Collections.Generic
using namespace System.Linq
 
param (
    $sourceDirectory = ".", #можно явно указать исходную папку, сейчас - текущий каталог
    $targetDirectory = "."  #целевой каталог
)
 
$numNative = 0
$numPDF = 0
$DebugPreference = "continue"
 
class TargetFile { #объявление класса, хранящего информацию о файле
    [string]$prefix
    [string[]]$copiesSuffixes
    [string]$extention
    [fileinfo]$sourceFile
    [fileinfo[]]$destFiles
 
    #функции, заполняющие экземпляр данными
    TargetFile ([string]$fullFileName){
        $filename = [path]::GetFileName($fullFileName)
        [string[]]$chanks = $filename.Split("-")
        $this.prefix = [string]::Join("-", $chanks[0..4])
        $this.copiesSuffixes = $chanks[5] -split ",\s*"
        $this.extention = [Path]::GetExtension($filename)
        $this.sourceFile = $fullFileName
        $this.destFiles = $this.copiesSuffixes.ForEach{
            [FileInfo][string]::join("-", $this.prefix, $_, $chanks[-1])
        }
    }
}
[list[TargetFile]]$sourceFiles =[list[TargetFile]]::new(); #создаём экземпляр класса
 
[System.IO.Directory]::GetFiles($sourceDirectory).ForEach{ #для каждого файла в директории
    #проверяем чтобы не зацепить лишние файлы
    if (($_ -match ".pdf|.dwg|.xls|.xlsx|.doc|.docx") -and ($_ -notmatch "ЧС-К")) #игнорируем файлы других расширений
    {
        $sourceFiles.Add([TargetFile]::new($_)) #добавляем файлы в список
    }
}
 
#[Directory]::GetFiles($sourceDirectory).ForEach{
#   if (($_ -match ".pdf|.dwg|.xls|.xlsx|.doc|.docx") -and ($_ -notmatch "ЧС-К")) {$sourceFiles.Add([TargetFile]::new($_))}
#} #это то же самое, но записано по другому
 
$sourceFiles  #вывод в консоль списка файлов
 
$currentDateTargetDirectory = [Path]::Join($targetDirectory, [datetime]::Today.ToString("yyyy-MM-dd")) 
if (![Directory]::Exists($currentDateTargetDirectory)){[Directory]::CreateDirectory($currentDateTargetDirectory)} #создаём папку с именем = текущая дата
 
[Enumerable]::GroupBy($sourceFiles, [func[TargetFile, string]]{$Args[0].prefix}).ToArray().ForEach{ #проходимся по массиву $sourceFiles
    $key = $_.key
    $currentKeyDirectory = [path]::Join($currentDateTargetDirectory, $key)
    if (![Directory]::Exists($currentKeyDirectory)){$null = [Directory]::CreateDirectory($currentKeyDirectory)} #создаём папку с именем = имя проекта
 
    $currentKeyNativeDirectory = [path]::Join($currentKeyDirectory, "Native")
    if (![Directory]::Exists($currentKeyNativeDirectory)){$null = [Directory]::CreateDirectory($currentKeyNativeDirectory)} #а в ней - папку Native
 
    $currentKeyPdfDirectory = [path]::Join($currentKeyDirectory, "Pdf")
    if (![Directory]::Exists($currentKeyPdfDirectory)){$null = [Directory]::CreateDirectory($currentKeyPdfDirectory)} #ну и папку PDF тоже
 
    $sourceFiles.Where{$_.prefix -eq $key}.foreach{ #идём по списку
        $extention = $_.extention
        
        $sourceFile = $_.sourceFile
        $_.destFiles.ForEach{ #бакс+подчеркивание - обращение к объёкту, вызвавшему текущий метод
            $destinationFilename = if ($extention -eq ".pdf")  #если расширение равно pdf
            {[path]::Join($currentKeyPdfDirectory, $_) #то кидаем файл в соответствующую папку
            $numNative++} 
            else 
            {[path]::Join($currentKeyNativeDirectory, $_) #ну и в Native в противном случае
            $numPDF++}
            [file]::Copy($sourceFile, $destinationFilename) #точнее кидаем файл тут, а там только папку выбрали
        }
        [file]::Delete($_.sourceFile) #и теперь можно удалить файл в исходной папке
    }
}
 
"Всего исходных файлов - "+$NumNative
"Всего PDF файлов - "+$numPDF
 
Read-Host -Prompt "Press Enter to exit"
0
 Аватар для alhaos
1934 / 549 / 155
Регистрация: 20.02.2019
Сообщений: 2,675
Записей в блоге: 77
08.09.2021, 06:34
ну если все страивает, то кто я такой чтобы мешать чужому счастью.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.09.2021, 06:34

Создание папок с именами заданных файлов и перемещение этих файлов в созданные папки
Подскажите пожалуйста как по названиям файлов txt создать папки и положить в каждую из папок файл с таким же названием.

Создание подпапок и перемещение в них файлов
Здравствуйте! В очередной раз нужна помощь. Имеем папку, назовем ее папка "А", в которой находятся подпапки А1, А2,...Аn. В...

Перемещение файлов и папок (с сохранением структуры) из нескольких сетевых папок в одну локальную
Доброго времени суток. Возникла необходимость в скрипте для забора файлов и папок (с сохр. структуры) из нескольких сетевых папок в одну...

Консольное приложение: отображение структуры файлов и папок, перемещение по папкам, открытие файлов
Приложение написанное на языке СИ позволяющее в консольном режиме отображать структуру файлов и папок,перемещаться по папкам и открывать на...

Перемещение файлов и папок
Доброй ночи Подскажите пожалуйста как перемещать файлы и папки программно на СИ++ под LINUX Функция rename может перемещать файлы, а...


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru