Войти

Показать полную графическую версию : [решено] Вывод списка файлов и их размеров в байтах из заданной папки


Vadikan
15-03-2011, 12:43
Привет, коллеги!

Нарисуйте, пожалуйста, скрипт, который выведет имена и размеры всех файлов (в байтах) из заданной папки.
В файле должны быть две пользовательские переменные:
%URL% - мой URL
%MYDIR% - полный путь к папке

Формат вывода:

%URL%/file1-name.ext
file1-size
%URL%/file2-name.ext
file2-size
...
и т.д.

Пример:
http://oszone.net/path/myfile1.exe
12345678
http://oszone.net/path/myfile2.exe
123456789

Файл записывать в заданную папку и открывать в дефолтном редакторе.

Спасибо!

Iska
16-03-2011, 02:09
Vadikan, примерно я набросал:
Option Explicit

' Enum IOMode
Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8


Dim strURL
Dim strFolder
Dim strFile

Dim objFSO
Dim objTS
Dim objFile

Dim objShell
Dim objFolder
Dim objFolderItem


With WScript.Arguments
strURL = .Item(0)
strFolder = .Item(1)
strFile = .Item(2)
End With

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

If objFSO.FolderExists(strFolder) Then
With objFSO.OpenTextFile(strFile, ForWriting, True)
For Each objFile In objFSO.GetFolder(strFolder).Files
.WriteLine strURL & "/" & objFile.Name
.WriteLine objFile.Size
Next

.Close
End With

Set objShell = WScript.CreateObject("Shell.Application")
Set objFolder = objShell.NameSpace(objFSO.GetParentFolderName(strFile))

If Not objFolder Is Nothing Then
Set objFolderItem = objFolder.ParseName(objFSO.GetFileName(strFile))

If Not objFolderItem Is Nothing Then
objFolderItem.InvokeVerb "Edit"

Set objFolderItem = Nothing
End If

Set objFolder = Nothing
End If

Set objShell = Nothing
Else
WScript.Echo "Can't find folder [" & strFolder & "]"
End If

Set objFSO = Nothing

WScript.Quit 0

Примерный вызов скрипта:
Script.vbs "http://oszone.net/path" "C:\Downloads\Software" "E:\Песочница\0040\0004.txt"
пока без каких-либо проверок, ибо есть ряд вопросов:
1. Какая нужна кодировка выходного файла (в примере — «ANSI»).

2. Куда класть выходной файл (в примере — кладётся туда, куда указано в командной строке при вызове скрипта). Или его, фактически, вообще можно не сохранять, а требуется только само сгенерированное содержимое, например, дабы скопировать его в буфер обмена?

3. Размер нужен именно в байтах, без изысков — как-то: деление на триады («2,855,699»), приведение к нормализованному виду («2,789 Кб»/«2,7 Мб»)?

4. Какой язык программирования предпочтителен?

Vadikan
16-03-2011, 03:22
Iska, спасибо!

1. Кодировка - без разницы, там кириллицы не будет.
2. Выходной - в папку с файлами. Но вообще, можно и не сохранять даже, если это лишний код.
3. Да, в байтах без изысков :)
4. Мне важен рез-т, а не язык.

Vadikan
17-03-2011, 23:23
Протестировал

Команда для запуска (из cmd):
contest_video.vbs "http://oszone.net/video/ie9/" "C:\Users\Name\Documents\Content_OSZone\IE9-Video\Name" "C:\Users\Name\Documents\Conent_OSZone\IE9-Video\Name\publish.txt"

---------------------------
Windows Script Host
---------------------------
Сценарий: C:\Users\Vadik\Documents\scripts\contest_video.vbs
Строка: 31
Символ: 2
Ошибка: Путь не найден
Код: 800A004C
Источник: Ошибка выполнения Microsoft VBScript

---------------------------
ОК
---------------------------

Iska
18-03-2011, 01:12
Vadikan, каюсь, это из-за:
пока без каких-либо проверок, »
В данном случае, вероятнее всего потому, что отсутствует путь к файлу «C:\Users\Vadik\Documents\Conent_OSZone\IE9-Video\Viktor Golub\publish.txt»:
"C:\Users\Name\Documents\Content_OSZone\IE9-Video\Name"
"C:\Users\Name\Documents\Conent_OSZone\IE9-Video\Name\publish.txt"
а это в выложенном скрипте никак не проверяется. Я добавлю ряд проверок и выложу исправленный скрипт сюда же.


И хотел бы ещё раз уточнить по второму вопросу (лучше прочитать сразу оба пункта, они связаны между собой):

а) Уточните, по возможности, конечную цель запуска редактора с сгенерированным текстом: Вы просто копируете текст без изменений в буфер обмена или как-то правите?

Цель: определить, возможно ли обойтись вовсе без создания файла, а вместо этого попробовать сразу помещать сгенерированный текст в буфер обмена.

б) Если редактор таки нужен, то ещё один вопрос: нужен ли, используется ли в последующем текстовый файл с сгенерированным текстом по закрытии редактора?

Цель: если текстовый файл впоследствии не нужен и никак не используется — возможно, стоит создавать его в папке временных файлов, открывать в редакторе, ждать завершения работы редактора и затем удалять.

Iska
18-03-2011, 01:42
Вот вариант скрипта с некоторыми проверками:
Option Explicit

' Enum IOMode
Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8


Dim strURL
Dim strFolder
Dim strFile

Dim objFSO
Dim objTS
Dim objFile

Dim objShell
Dim objFolder
Dim objFolderItem


With WScript.Arguments
If .Count = 3 Then
strURL = .Item(0)
strFolder = .Item(1)
strFile = .Item(2)
Else
WScript.Echo "Usage: " & WScript.ScriptName & " <Url path> <Folder to scan> <File to output>"
WScript.Quit 1
End If
End With


Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

strFolder = objFSO.GetAbsolutePathName(strFolder)
strFile = objFSO.GetAbsolutePathName(strFile)

If objFSO.FolderExists(strFolder) Then
If objFSO.FolderExists(objFSO.GetParentFolderName(strFile)) Then
If Right(strURL, 1) <> "/" Then
strURL = strURL & "/"
End If

With objFSO.OpenTextFile(strFile, ForWriting, True)
For Each objFile In objFSO.GetFolder(strFolder).Files
If objFile.Path <> strFile Then
.WriteLine strURL & objFile.Name
.WriteLine objFile.Size
End If
Next

.Close
End With

Set objShell = WScript.CreateObject("Shell.Application")
Set objFolder = objShell.NameSpace(objFSO.GetParentFolderName(strFile))

If Not objFolder Is Nothing Then
Set objFolderItem = objFolder.ParseName(objFSO.GetFileName(strFile))

If Not objFolderItem Is Nothing Then
objFolderItem.InvokeVerb "Edit"

Set objFolderItem = Nothing
End If

Set objFolder = Nothing
End If

Set objShell = Nothing
Else
WScript.Echo "Can't find path [" & objFSO.GetParentFolderName(strFile) & "] to create file [" & strFile & "]"
End If
Else
WScript.Echo "Can't find folder [" & strFolder & "]"
End If

Set objFSO = Nothing

WScript.Quit 0

* проверяется существование путей папки для сканирования и файла со сгенерированным текстом;
* url может задаваться как с конечным слэшем, так и без — слэш будет добавлен в Url автоматически;
* имя самого создаваемого текстового файла не будет помещёно в список.

Vadikan
18-03-2011, 23:16
Iska, точно, моя вина... вроде копипастом вставлял пути. Первоначальный скрипт работает!

Да, я просто копирую текст в буфер обмена и вставляю в вебе. Файл мне вроде не нужен потом, но можно не заморачиваться - удалить все файлы с одинаковыми именами из одной библиотеки не проблема. Да и вдруг файлы пригодятся :)

Второй вариант тоже работает, спасибо большое за помощь!




© OSzone.net 2001-2012