Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Как создать серию папок с папками внутри (10 входов по папкам)? (http://forum.oszone.net/showthread.php?t=343578)

NLOLegion 08-01-2020 11:44 2904011

Как создать серию папок с папками внутри (10 входов по папкам)?
 
Собственно суть задачи такова:
-создать 10 папок(например в диске "C" (в папке "test") с названием каждой "0","1","2","3","4","5","6","7","8","9";
-в каждой этой папке создать ещё 10 папок "0","1","2","3","4","5","6","7","8","9"
-в свою очередь в каждой новой папке ещё по 10 папок с такими же названиями
-создать до такого количества раз, чтобы в итоге можно было зайти на глубину 10 папок. Например зашёл в папку 3, далее в 5, потом 1, далее 0 и так далее 10 раз(входов)
-важным критерием является контроль глубины создания папок, чтобы в скрипте можно было выставить сколько создавать. (может кому то и 3 входа достаточно будет.
-если возможно так же иметь возможность контролировать количество созданных папок(не ограничиваться "девяткой" ,а использовать и меньшее количество папок с названиями, а так же продолжить использовать цифры далее цифры "9"(10,11,12 и т.д),или даже весть латинский алфавит вместо цифр(как вариант)

В чём цель? Собственно - например ваша мама родилась 02.03.1965 г. , используя эти цифры, и последовательно открывая папки с соответствующими номерами мы попадём в конечную папку 5 в которой будут храниться необходимые данные связанные именно с этим человеком(мама) или датой. Ну и любые другие комбинации цифр или слов.
Одним словом суть этой задачи - ХРАНИЛИЩЕ. Причём использование готовой серии папок любым даже самым простым человека без всяких паролей и шифрования.

Busla 08-01-2020 11:55 2904013

Цитата:

Цитата NLOLegion
02.03.1965 »

LOL, это, типа, пароль что ли получится для доступа к данным?

а "самый простой человек" против которого это задумывается совершенно не умеет поиском пользоваться?

NLOLegion 08-01-2020 12:06 2904014

Busla, речь о скрытии данных не идёт. Плюс искать можно что-то конкретное, а не все типы файлов которые можно засунуть в одну папку.

Iska 08-01-2020 12:38 2904020

NLOLegion, это никак не объясняет необходимости создания огромного дерева каталогов.

megaloman 08-01-2020 13:07 2904022

Имена папок могут быть любыми, как и их количество. Насчет вложенности (здесь Set /A Nest=4) , для большого числа (вы указывали 10) предложенный код будет работать долго.
Код:

@Echo Off
        Set /A Nest=4
        Set "BoxIn=Z:\Test"

        Set "@01=0"
        Set "@02=1"
        Set "@03=2"
        Set "@04=3"
        Set "@05=4"
        Set "@06=5"
        Set "@07=6"
        Set "@08=7"
        Set "@09=8"
        Set "@10=9"

        FOR /F "usebackq tokens=2 delims==" %%i IN (`2^>nul Set "@"`) Do 2>nul md "%BoxIn%\%%i"
        FOR /L %%n IN (2,1,%Nest%) DO (
                FOR /F "usebackq delims=" %%d IN (`2^>nul Dir "%BoxIn%" /B /S /A:D`) Do Call :NestMD "%%d"
        )
pause
Exit /B

:NestMD
        FOR /F "usebackq tokens=2 delims==" %%i IN (`2^>nul Set "@"`) Do 2>nul md "%~1\%%i" ||Exit /B 1
Exit /B

Пример произвольных имен
Код:

        Set "@01=ku ku"
        Set "@02=la la"
        Set "@03=ой ё"


iglezz 08-01-2020 16:52 2904049

Вариант на WSH JScript: MkFoldersRecurse.js
Скрытый текст
Код:

// Папка:
var targetFolder = "d:\\xxTESTxx";
// Массив создаваемых папок:
var foldersList = [
        "0",
        "1",
        "2",
        "3",
        "4",
        "5",
        "6",
        "7",
        "8",
        "9"
        ];
// Глубина создаваемой структуры папок:
var foldersDepth = 2;

var newf = '';
var wsh = WScript.CreateObject("WScript.Shell");
var fso = new ActiveXObject("Scripting.FileSystemObject");
if (!TestWritable(targetFolder)) {
        msg("Ошибка записи в папку " + targetFolder);
        WScript.Quit(1);
}

if (wsh.Popup("Будет создано " + GetFoldersNumber(foldersList.length, foldersDepth) + " папок.\n\nПродолжить?", 0, "", 4) != 6 )
        WScript.Quit(0);
var timeStart = new Date();
CreateFolders(targetFolder, foldersList, foldersDepth);
var timeFinish = new Date();
msg((timeFinish - timeStart) + " msec.")

function msg(s){WScript.Echo(s);}

function TestWritable(parentFolder) {
        var testFolderName = parentFolder + "\\" + "testFolderName";
        try {
                fso.CreateFolder(testFolderName);
        } catch(error) {
                return false;
        }
        fso.DeleteFolder(testFolderName, true);
        return true
}

function GetFoldersNumber(n, d) {
        var sum = 0;
        for (var i = 1; i <= d ; i++)
                sum += Math.pow(n, i);
        return sum;
}

function CreateFolders(parentFolder, foldersList, foldersDepth){
        var depth = foldersDepth == undefined ? foldersList.length : foldersDepth;
        if (depth == 0)
                return;

        for (var f in foldersList) {
                newf = parentFolder + "\\" + foldersList[f]
                if (!fso.FolderExists(newf)) fso.CreateFolder(newf);
                CreateFolders(newf, foldersList, depth - 1)
        }
}



Цитата:

Цитата NLOLegion
-создать 10 папок(например в диске "C" (в папке "test") с названием каждой "0","1","2","3","4","5","6","7","8","9";
-в каждой этой папке создать ещё 10 папок "0","1","2","3","4","5","6","7","8","9"
-в свою очередь в каждой новой папке ещё по 10 папок с такими же названиями
-создать до такого количества раз, чтобы в итоге можно было зайти на глубину 10 папок. Н »

Жалко компа, он же сдохнуть может от такой нагрузки :)

Цитата:

Цитата megaloman
10 миллиардов папок - занадта! »

NTFS вроде как лимит в 4,294,967,295 (2^32-1) имеет :)

NLOLegion 09-01-2020 06:54 2904136

Цитата:

Цитата iglezz
Жалко компа, он же сдохнуть может от такой нагрузки »

да, можно использовать осознанно и с этой целью;)

alhaos 15-01-2020 09:54 2905044

Кто я чтобы мешать чужому счастью )))

param(
$workPath = 'c:\tmp\root'
)

cls
$iteration = 0

function makeFolderTree {
If ($iteration -eq 0)
{
(1..10) | ForEach-Object{
New-Item -ItemType Directory -Path (Join-Path -Path $WorkPath -ChildPath $_) | Out-Null
}
}
foreach ($leaf in (Get-ChildItem -Directory -Recurse -Path $workPath | Where-Object {!(Get-ChildItem $_.FullName -Directory)}).FullName){
(1..10) | ForEach-Object{
New-Item -ItemType Directory -Path (Join-Path -Path $leaf -ChildPath $_) | Out-Null
}
}
$iteration++
If ($iteration -eq 10){
break
}
$iteration
makeFolderTree
}

makeFolderTree


Время: 23:28.

Время: 23:28.
© OSzone.net 2001-