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

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

JimmOnLine 15-07-2019 18:36 2879919

Структура папок
 
Добрый день!
Подскажите пожалуйста. Необходимо реализовать скрипт (не важно на чем), который бы записывал в Excel структуру каталогов. Пример:

Код:

Folder1
    Folder2
    Folder3
    Folder4
          Folder4
          Folder5
              Folder6
Folder7
    Folder8

... ... ... ... ... ... ... ... ... ... ... ... ... ...
и т.д.

Iska 15-07-2019 19:16 2879925

JimmOnLine, как именно записывал? Всё одну ячейку? Один каталог — одна строка таблицы? Отступы — пробелы, табуляция или следующий столбец таблицы?

Почему именно Excel?

megaloman 15-07-2019 21:43 2879950

скрипт VBS, который записывает в Excel структуру каталогов.
Код:

AllDir = "Z:\Box_In"                        ' Полное имя рабочего каталога (без слэжа \ на конце)
Range1 = "C3"                                ' C какой ячейки стром дерево
ColWidth = 3                                ' Ширина колонок

Set XL = CreateObject("Excel.Application")
XL.Visible = True
XL.Workbooks.Add

XL.Cells.ColumnWidth = ColWidth

Row1 = 0
Col1 = 0

XL.Range(Range1).FormulaR1C1 = "=""" + AllDir + """"

Set FSO = CreateObject("Scripting.FileSystemObject")
Call AllFolders(FSO, AllDir, Range1, Col1, Row1, XL)

' ---------------------------------------------------------------------------
Sub AllFolders(FSO, WDir, Range1, C1, R1, XL)
    Set F = FSO.GetFolder(WDir)
    Set SubF = F.SubFolders
    For Each Folder In SubF
        R1 = R1 + 1
        XL.Range(Range1).Offset(R1, C1 + 1) = "=""" + Folder.Name + """"
        Call AllFolders(FSO, WDir + "\" + Folder.Name, Range1, C1 + 1, R1, XL)
    Next
    C1 = C1 + 1
End Sub


it3 16-07-2019 06:15 2879981

Вложений: 1
Цитата:

Цитата megaloman
скрипт VBS, который записывает в Excel структуру каталогов. »

При запуске выходит ошибка [скриншот во вложении).

JimmOnLine 16-07-2019 06:27 2879983

Цитата:

Цитата Iska (Сообщение 2879925)
JimmOnLine, как именно записывал? Всё одну ячейку? Один каталог — одна строка таблицы? Отступы — пробелы, табуляция или следующий столбец таблицы?

Почему именно Excel?

1. Один каталог -> одна строка таблицы.
2. Следующий столбец.
3. Excel - более удобный инструмент для дальнейшей обработки сформированных данных.

Sham 16-07-2019 08:58 2879991

Цитата:

Цитата it3
При запуске выходит ошибка [скриншот во вложении) »

без BOM сохраняйте

it3 16-07-2019 10:20 2880002

Цитата:

Цитата megaloman
JimmOnLine, Переименуйте Ваш 1.vbs в 1.txt и приложите к сообщению. Кстати, VBS надо сохранять в 1251 кодировке. Мой скрипт прилагаю (в переименованном виде). »

Работает.

JimmOnLine 16-07-2019 10:22 2880003

Цитата:

Цитата Sham (Сообщение 2879991)
Цитата:

Цитата it3
При запуске выходит ошибка [скриншот во вложении) »

без BOM сохраняйте

Почему то не все каталоги выводятся в Excel.

megaloman 16-07-2019 10:26 2880005

Вложений: 1
JimmOnLine, Прикрепляю свой файл со скриптом (в переименованном виде). При наличии кириллицы в пути, скрипт надо сохранять в 1251 кодировке (например, в стандартном блокноте). Переименуйте свой скрипт в txt и приложите к сообщению.
Цитата:

Цитата JimmOnLine
Excel - более удобный инструмент для дальнейшей обработки сформированных данных. »

Как именно обрабатывать Вы их хотите? Что в результате должно получиться?

JimmOnLine 16-07-2019 10:34 2880006

Цитата:

Цитата megaloman (Сообщение 2880005)
JimmOnLine, Прикрепляю свой файл со скриптом (в переименованном виде). При наличии кириллицы в пути, скрипт надо сохранять в 1251 кодировке (например, в стандартном блокноте). Переименуйте свой скрипт в txt и приложите к сообщению.
Цитата:

Цитата JimmOnLine
Excel - более удобный инструмент для дальнейшей обработки сформированных данных. »

Как именно обрабатывать Вы их хотите? Что в результате должно получиться?

Собственно суть в том, что необходимо организовать матрицу доступа к сетевым каталогам, для этого необходимо создать группы безопасности. Для того, чтобы это реализовать, хочу сперва построить это схематично (путем Excel), далее "Транслитерировать" наименования каталогов в Excel, ну а затем CopyPast'ить из документа в наименование Групп безопасности.

Busla 16-07-2019 11:38 2880013

Цитата:

Цитата JimmOnLine
Excel - более удобный инструмент для дальнейшей обработки сформированных данных. »

это если уметь им пользоваться, а у вас какое-то рисование по клеточкам

по уму надо заполнять так:
Код:

Folder1 | Folder2 |        |        |
Folder1 | Folder3 |        |        |
Folder1 | Folder4 | Folder4 |        |
Folder1 | Folder4 | Folder5 | Folder6 |

тогда и фильтры работают, и полный путь извлекается без танцев с бубном

JimmOnLine 16-07-2019 11:49 2880014

Цитата:

Цитата Busla (Сообщение 2880013)
и полный путь извлекается без танцев с бубном

Хм. Наверное в этом есть смысл. Остаётся вопрос с реализацией.

megaloman 16-07-2019 13:02 2880029

JimmOnLine,
Цитата:

Цитата JimmOnLine
Хм. Остаётся вопрос с реализацией. »

Хм. Не вопрос!
Код:

AllDir = "Z:\Box_In"                    ' ---------  Полное имя рабочего каталога (без слэжа \ на конце)
Range1 = "C3"

Set XL = CreateObject("Excel.Application")
XL.Visible = True
XL.Workbooks.Add

Row1 = 0

XL.Range(Range1).FormulaR1C1 = "=""" + AllDir + """"

Set FSO = CreateObject("Scripting.FileSystemObject")
Call AllFolders(FSO, AllDir, AllDir, Range1, Row1, XL)
XL.Cells.EntireColumn.AutoFit

' ---------------------------------------------------------------------------
Sub AllFolders(FSO, AllDir, WDir, Range1, R1, XL)
    Set F = FSO.GetFolder(WDir)
    Set SubF = F.SubFolders
    For Each Folder In SubF
        R1 = R1 + 1
        MName = Split(Replace(WDir + "\" + Folder.Name, AllDir + "\", "", 1, 1), "\")
        C1 = 0
        XL.Range(Range1).Offset(R1, C1) = "=""" + AllDir + """"
        For Each jName In MName
            C1 = C1 + 1
            XL.Range(Range1).Offset(R1, C1) = "=""" + jName + """"
        Next
        Call AllFolders(FSO, AllDir, WDir + "\" + Folder.Name, Range1, R1, XL)
    Next
'    C1 = C1 + 1
End Sub


Busla 16-07-2019 17:12 2880085

Цитата:

Цитата JimmOnLine
Остаётся вопрос с реализацией. »

обход дерева делается встроенными средствами, а дальше просто разбить строку по слэшу:
Код:

Get-ChildItem -Path c:\temp -Directory -Recurse `
| % { Write-Output ($_.FullName -split '\\') -NoEnumerate } `
| .{
    begin {
        $excel = New-Object -ComObject Excel.Application
        $excel.Visible = $true
        $workBook = $excel.Workbooks.Add()
        $folderList = $workBook.Worksheets.Item(1)
        $row=1
    }
    process {
        $_ | .{
            begin {
                $row++
                $column = 1
            }
            process {
                $FolderList.Cells.Item($row,$column++)="'$_"
            }
        }
    }
}


YuS_2 16-07-2019 18:07 2880107

Цитата:

Цитата JimmOnLine
который бы записывал в Excel структуру каталогов. Пример: »

powershell
Код:

$root = 'd:\111'
$file = "$psscriptroot\out.xlsx"
$ids = ps excel -ea 0|%{$_.id}
$excel = new-object -com excel.application
$excelid = ps excel|%{$_.id}|?{$excelids -notcontains $_}
$excel.visible = $false
$workbook = $excel.workbooks.add()
$worksheet = $workbook.worksheets.item(1)
$row,$col=1,1
$worksheet.cells.item($row, $col) = $root
$content = dir -lit $root -dir -rec|sort fullname

foreach ($item in $content){
        $row++
        [array]$arr = $item.fullname -split "$([regex]::escape($root))|\\"|
        ?{$_ -ne ''}
        $col = $arr.length + 1
        $worksheet.cells.item($row, $col) = $item.name
}
$usedrange = $worksheet.usedrange
$usedrange.entirecolumn.autofit()|out-null
$workbook.saveas($file)
$excel.quit()
kill -id $excelid -force -ea 0

Цитата:

Цитата JimmOnLine
хочу сперва построить это схематично (путем Excel), далее "Транслитерировать" наименования каталогов в Excel, ну а затем CopyPast'ить из документа в наименование Групп безопасности. »

сомневаюсь, что это удобнее... скорее powershell-ом это проще сделать, в том числе и транслитерацию...


Время: 12:21.

Время: 12:21.
© OSzone.net 2001-