Компьютерный форум 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=346559)

burolf 28-09-2020 15:53 2935124

Составить список файлов из папки в заданном виде
 
Дорого времени суток, великие и могучие!
Помогите пожалуйста. Как сделать батник, который из папки с файлами смог бы сформировать файл txt по следующему принципу:

В папке есть n количество файлов (оно всегда растет)

Необходимо в txt файле создать текст следующего формата:

Range("A1").Select
ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="P:\files\название файла с расширением" _
, TextToDisplay:="P:\files\название файла с расширением"
Range("A2").Select
ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="P:\files\название второго файла с расширением" _
, TextToDisplay:="P:\files\название второго файла с расширением"
.......................
Range("An").Select
ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="P:\files\название n-ого файла с расширением" _
, TextToDisplay:="P:\files\название n-ого файла с расширением"

В этом случае "P:\files\" константа, которую можно задавать в зависимости от расположения файла перед запуском батника

ЛИБО

Range("A1").Select
ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="название файла с расширением и путем к нему" _
, TextToDisplay:="название файла с расширением и путем к нему"
Range("A2").Select
ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="название второго файла с расширением и путем к нему" _
, TextToDisplay:="название второго файла с расширением и путем к нему"
.............................
Range("An").Select
ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="название n-ого файла с расширением и путем к нему" _
, TextToDisplay:="название n-ого файла с расширением и путем к нему"


Кому интересно для чего это мне необходимо. Я хочу потом данный текст скопировать в Макрос excel и создать файл с гиперссылками на файлы в папке, в которой этот батник будет запущен.
Непосредственно в excel не раздуплю как это сделать. Помогите пожалуйста. Или подскажите какой софт есть для автоматизации этого процесса.

Fors1k 28-09-2020 17:03 2935127

Цитата:

Цитата burolf
создать файл с гиперссылками на файлы в папке »

Код:

param(
    $pathFolder = 'C:\files',
    $pathXls    = 'C:\docs\links.xlsx'
)cls

$Excel = New-Object -ComObject Excel.Application
$WorkBook  = $Excel.Workbooks.Add()
$WorkSheet = $WorkBook.Worksheets.Item(1)
gci $pathFolder -rec -file|%{$i=1}{ 
    [void]$WorkSheet.Cells.Hyperlinks.Add(
        $workbook.Worksheets.Item(1).Cells.Item($i++,1),$_.FullName
    )
}
$Range = $WorkSheet.UsedRange
[void]$Range.EntireColumn.AutoFit()
$workBook.saveAs($pathXls);$excel.Quit()
[Runtime.InteropServices.Marshal]::ReleaseComObject($excel)


greg zakharov 28-09-2020 17:59 2935133

Fors1k, а кто экземпляр COM освободит? Хотя по идее это должен делать GC, в действительности этого никогда не произойдёт. Поэтому помимо прочего нужно вызвать ReleaseComObject после Quit ([Runtime.InteropServices.Marshal]::RealeaseComObject($excel)).

burolf 29-09-2020 09:51 2935178

Я скопировал этот текст в батник, запустил, но файл не создался. Что я делаю не так? (

Elven 29-09-2020 10:45 2935184

Наверное, потому, что это не батник. Сохраните текст в файле с расширением ps1 и запускайте через powershell.

burolf 29-09-2020 11:24 2935189

Запустил код :

param(
$pathFolder = 'p:\file',
$pathXls = 'p:\links.xlsx'
)cls

$Excel = New-Object -ComObject Excel.Application
$WorkBook = $Excel.Workbooks.Add()
$WorkSheet = $WorkBook.Worksheets.Item(1)
gci $pathFolder -rec -file|%{$i=1}{
[void]$WorkSheet.Cells.Hyperlinks.Add(
$workbook.Worksheets.Item(1).Cells.Item($i++,1),$_.FullName
)
}
$Range = $WorkSheet.UsedRange
[void]$Range.EntireColumn.AutoFit()
$workBook.saveAs($pathXls);$excel.Quit()
[Runtime.InteropServices.Marshal]::ReleaseComObject($excel)

через powershell. Файл xlsx создался, УРА! но он пустой, там нет никаких ссылок. (

Выдает еще ошибку :

Get-ChildItem : Не удается найти параметр, соответствующий имени параметра "file".
строка:1 знак:27
+ gci $pathFolder -rec -file <<<< |%{$i=1}{
+ CategoryInfo : InvalidArgument: (:) [Get-ChildItem], ParameterBindingException
+ FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

alpap 29-09-2020 15:12 2935204

Цитата:

Цитата burolf
текст скопировать в Макрос excel и создать файл с гиперссылками на файлы в папке »

чего не сразу из txt файла
Код:

@echo off
set "spath=C:\Papka"

>file.txt (for /f "delims=" %%a in ('dir /a-d/b/s "%spath%\*.*"') do @set "f=%%a"& call echo file:///%%f:\=/%%)
pause

Забыл указать, текстовый редактор должен быть не штатный виндовый блокнот, а что-то посолиднее, иначе наверное не получится.

burolf 29-09-2020 15:37 2935207

спасибо за участие, но при таком варианте просто создается txt файл с адресами на файлы и все. Как сделать именно гиперссылки внутри excel?

burolf 29-09-2020 16:28 2935211

спасибо за участие, но при таком варианте просто создается txt файл с адресами на файлы и все. Как сделать именно гиперссылки внутри excel?

Fors1k 29-09-2020 18:20 2935222

Цитата:

Цитата burolf
Выдает еще ошибку »

Код:

$host.Version.Major
Если покажет меньше пяти, то установите обновление:
https://www.microsoft.com/en-us/down....aspx?id=54616

megaloman 29-09-2020 22:30 2935234

Цитата:

Цитата burolf
Я хочу потом данный текст скопировать в Макрос excel и создать файл с гиперссылками на файлы в папке, в которой этот батник будет запущен. »

Это особо циничное извращение :), но вот решение, как Вы этого хотели:
Код:

@Echo Off
cls
>nul Chcp 1251

        Set "BoxIn=Z:\Box_In\У попа была собака"
        Set "Mask=*.*"

        Set "FileOut=Z:\Бред сивой кобылы.txt"

        Set /A N=0
        >"%FileOut%" (FOR /F "usebackq delims=" %%f IN (`2^>nul Dir /B /A:-D "%BoxIn%\%Mask%"`) DO (
                Call Set /A N+=1
                Call Echo ActiveSheet.Hyperlinks.Add Anchor:=Range^("A%%N%%"^), Address:="%BoxIn%\%%f", TextToDisplay:="%BoxIn%\%%f"
        ))
pause
Exit /B

Батник сохранить в 1251 кодировке
Вот макрос Excel для создания в ячейках гиперссылок на файлы в указанной папке безо всяких txt
Код:

Sub DirGiper()

MyDir = "Z:\Box_In\У попа была собака"
MyMask = "^.*\..*$"

Set Reg = CreateObject("VBScript.RegExp")
Reg.IgnoreCase = True
Reg.Pattern = MyMask

With CreateObject("Scripting.FileSystemObject")
    Set Files = .GetFolder(MyDir).Files
   
    N = 0
    For Each File In Files
        Filename = File.Path
        If Reg.Test(Filename) Then
            N = N + 1
            ActiveSheet.Hyperlinks.Add Anchor:=Range("A" + CStr(N)), Address:=Filename, TextToDisplay:=Filename
        End If
    Next
End With
MsgBox "Done"

End Sub

Вот VBS-скрипт (создать файл с расширением .vbs в 1251 кодировке и выполнить его), и никакого левого txt-файла и ручной работы не потребуется
Код:

MyDir = "Z:\Box_In\У попа была собака"
MyMask = "^.*\..*$"

Set Reg = CreateObject("VBScript.RegExp")
Reg.IgnoreCase = True
Reg.Pattern = MyMask

Set Files = CreateObject("Scripting.FileSystemObject").GetFolder(MyDir).Files

With CreateObject("Excel.Application")
        .Visible = True
        .Workbooks.Add
   
            N = 0
        For Each File In Files
                Filename = File.Path
                If Reg.Test(Filename) Then
                        N = N + 1
                        Call .ActiveSheet.Hyperlinks.Add(.Range("A" + CStr(N)), Filename)
                End If
        Next
End With

Естественно, в любом решении надо прописать свои пути.

burolf 02-10-2020 12:09 2935398

Друзья! Спасибо огромное за помощь! Первый предложенный вариант действительно работает, просто надо было обновиться. Но хотелось бы выделить пользователя megaloman он предложил самый точный вариант соответствующий ТЗ и кроме того добавил самый адекватный и логически правильный вариант решения данной проблемы! Его макрос работает. Всем рекомендую! Спасибо ресурсу за возможность решения моей проблемы так быстро!:)

burolf 02-10-2020 12:48 2935406

[post]Вот макрос Excel для создания в ячейках гиперссылок на файлы в указанной папке безо всяких txt[post]

А как бы сделать чтобы после запуска данного макроса в результате в ячейке отображался не путь к папке, а что-то вроде кнопки или слово "ССЫЛКА" и ячейка подсвечивалась каким-либо цветом, к примеру нежно зеленым. :grin:

megaloman 02-10-2020 15:16 2935418

после запуска данного макроса в результате в ячейке отображался не путь к папке, а что-то вроде кнопки или слово "ССЫЛКА" и ячейка подсвечивалась каким-либо цветом, к примеру нежно зеленым
Код:

Sub DirGiper0()

MyDir = "Z:\Box_In\У попа была собака"
MyMask = "^.*\..*$"

Set Reg = CreateObject("VBScript.RegExp")
Reg.IgnoreCase = True
Reg.Pattern = MyMask

With CreateObject("Scripting.FileSystemObject")
    Set Files = .GetFolder(MyDir).Files
   
    N = 0
    For Each File In Files
        Filename = File.Path
        If Reg.Test(Filename) Then
            N = N + 1
            ActiveSheet.Hyperlinks.Add Anchor:=Range("A" + CStr(N)), Address:=Filename, TextToDisplay:="Ссылка"
           
            With Range("A" + CStr(N))
                With .Font
                    .FontStyle = "полужирный курсив"
                End With
                With .Interior
                    .Pattern = xlSolid
                    .Color = 12314553
                End With
                With .Borders(xlEdgeLeft)
                    .LineStyle = xlContinuous
                    .Weight = xlMedium
                End With
                With .Borders(xlEdgeTop)
                    .LineStyle = xlContinuous
                    .Weight = xlMedium
                End With
                With .Borders(xlEdgeBottom)
                    .LineStyle = xlContinuous
                    .Weight = xlMedium
                End With
                With .Borders(xlEdgeRight)
                    .LineStyle = xlContinuous
                    .ColorIndex = 0
                    .TintAndShade = 0
                    .Weight = xlMedium
                End With
            End With
        End If
    Next
End With
MsgBox "Done"
End Sub



Время: 20:41.

Время: 20:41.
© OSzone.net 2001-