Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - Как каталогизировать папки средствами JS ?

Ответить
Настройки темы
VBS/WSH/JS - Как каталогизировать папки средствами JS ?

Пользователь


Сообщения: 87
Благодарности: 0

Профиль | Отправить PM | Цитировать


Имеется папка с множеством вложенных папок разных уровней вложения и файлы в каждой из них.
Необходимо методами JS разместить в каждой папке текстовый файл со списком содержащихся в ней файлов (но не папок) и именем папки в кодировке 1251.
Прошу помощи.

Отправлено: 13:52, 01-05-2018

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


ruslaw, VBScript устроит?

Отправлено: 14:03, 01-05-2018 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Пользователь


Сообщения: 87
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 15:20, 01-05-2018 | #3


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


ruslaw, в таком виде задача выглядит бессмысленной деятельностью, т.к. содержимое директории на нижнем уровне практически и есть "текстовый файл со списком содержащихся в ней файлов"

Iska, с вашим опытом перенести перенести простой скрипт из VB в JS - всё равно, что почесаться. А вы продолжаете некромантию пропагандировать.

Отправлено: 15:22, 01-05-2018 | #4


Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить PM | Цитировать


js
Код: Выделить весь код
var AllDir = "D:\\CMD_Forum\\Муз";    // ---------  Полное имя рабочего каталога (без слэжа \ на конце) 

var Maska = "^.*\\..*$";

var FSO = WScript.CreateObject("Scripting.FileSystemObject");

var RegMaska = new RegExp(Maska);
RegMaska.IgnoreCase = true;

AllFiles(AllDir);

// -------------------------------------------
function AllFiles(WDir) {
	var Folds = FSO.GetFolder(WDir);
	var Finfo = FSO.OpenTextFile(WDir + "\\!!! " + Folds.Name + ".Info", 	2, true);
	var SubF =  new Enumerator(Folds.SubFolders);
	var Files = new Enumerator(Folds.Files);
	var jf;
	Finfo.WriteLine("+++ " + Folds.Name + " +++  " + WDir);

	while (!Files.atEnd()) {
		jf = Files.item().Name;	
		if (RegMaska.test(jf)) {
			Finfo.WriteLine(jf);
		}
		Files.moveNext();
	}
	Finfo.Close();

	while (!SubF.atEnd()) {
		AllFiles(WDir + "\\" + SubF.item().Name);
		SubF.moveNext();
	}
}
vbs
Код: Выделить весь код
Public FSO, RegMaska

AllDir = "D:\CMD_Forum\Муз"    ' ---------  Полное имя рабочего каталога (без слэжа \ на конце)
Maska= "^.*\..*"

Set FSO = CreateObject("Scripting.FileSystemObject")

Set RegMaska = New RegExp
RegMaska.Pattern = Maska
RegMaska.IgnoreCase = True

Call AllFiles(AllDir)

MsgBox "Скрипт завершился"

' ---------------------------------------------------------------------------
Sub AllFiles(WDir)

    Set Folds = FSO.GetFolder(WDir)
    Set SubF = Folds.SubFolders
    Set Files = Folds.Files

    Set Finfo = FSO.OpenTextFile(WDir + "\!!! " + Folds.Name + ".Info", 	2, True)
    Finfo.WriteLine "+++ " + Folds.Name + " +++  " + WDir

    For Each jF In Files
	If RegMaska.Test(jf) Then 
        	Finfo.WriteLine FSO.GetFileName(jF)
        End If
    Next

    Finfo.Close

    For Each Folder In SubF
        Call AllFiles(WDir + "\" + Folder.Name)
    Next

End Sub
bat
Код: Выделить весь код
@Echo Off
chcp 1251 >nul

Set "AllDir=D:\CMD_Forum\Муз"

Set "Maska=*.*"

Call :SpisFiles "%AllDir%"
FOR /F "usebackq delims=" %%d IN (`2^>nul Dir "%AllDir%" /B /S /A:D`) DO Call :SpisFiles "%%d"
GoTo :Eof

:SpisFiles
	>"%~1\!!! %~nx1.Info" (
		Echo +++ %~nx1 +++  %~1
		FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%~1\%Maska%" /B /A:-D`) DO Echo %%f
	)
GoTo :Eof
cmd/bat ваяется многократно быстрее

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 02-05-2018 в 06:48.

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:22, 01-05-2018 | #5


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Busla:
Iska, с вашим опытом перенести перенести простой скрипт из VB в JS - всё равно, что почесаться.»
Busla, вовсе нет, я крайне слабо знаю JScript.

Цитата Busla:
А вы продолжаете некромантию пропагандировать. »
Что значит «некромантию»? Они ровесники. И вообще — «Мы работаем дедовскими методами, но зато на совесть»™ .

Цитата megaloman:
cmd/bat ваяется многократно быстрее »
Кому как .

Отправлено: 21:31, 01-05-2018 | #6


Пользователь


Сообщения: 87
Благодарности: 0

Профиль | Отправить PM | Цитировать


megaloman, большое спасибо, JS-скрипт отработал отлично.
Кстати, батник создал только один индекс-файл - в указанной папке, а по подпапкам не пошел, но это не страшно, меня интересует именно JS.
И еще вопрос. Можно ли исключить из индексации (на JS-скрипте) скрытые папки, причем у меня в таких папках находятся видимые (не скрытые) подпапки и файлы?

Отправлено: 23:45, 01-05-2018 | #7


Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить PM | Цитировать


ruslaw,
ruslaw, а как насчет: а JS я смог бы потом модифицировать? :)
Код: Выделить весь код
var AllDir = "D:\\CMD_Forum\\Box_In";    // ---------  Полное имя рабочего каталога (без слэжа \ на конце) 
 
var Maska = "^.*\\..*$";

var FSO = WScript.CreateObject("Scripting.FileSystemObject");

var RegMaska = new RegExp(Maska);
RegMaska.IgnoreCase = true;

AllFiles(AllDir);

// -------------------------------------------
function AllFiles(WDir) {
	var Folds = FSO.GetFolder(WDir);
	var FAttr = Folds.Attributes;
	if (FAttr & 2 || FAttr & 4) {return}	

	var Finfo = FSO.OpenTextFile(WDir + "\\!!! " + Folds.Name + ".Info", 	2, true);
	var SubF =  new Enumerator(Folds.SubFolders);
	var Files = new Enumerator(Folds.Files);
	var jf;
	Finfo.WriteLine("+++ " + Folds.Name + " +++  " + WDir);

	while (!Files.atEnd()) {
		jf = Files.item().Name;	
		if (RegMaska.test(jf)) {
			Finfo.WriteLine(jf);
		}
		Files.moveNext();
	}
	Finfo.Close();

	while (!SubF.atEnd()) {
		AllFiles(WDir + "\\" + SubF.item().Name);
		SubF.moveNext();
	}
}
Пора начинать, есть повод!

Цитата Iska:
я крайне слабо знаю JScript. »
- Скромничаете? Рискую быть подвергнутым остракизму и нехорошим словам, я крайне слабо знаю JScript и, главное, его недолюбливаю. Предложенное решение с атрибутами наверное очень кривое. Дело в том, что значение атрибута папки может принимать достаточно многочисленные значения, как сумма всех атрибутов, например: Папка (16), папка архивная (48), скрытая (18), системная (20), скрытая и системная (22), скрытая системная архивная (54) и это далеко не все значения. Как вычленить из всего многообразия значений признак скрытости не знаю. Наверное, есть какой-то метод или арифметический трюк .... Либо определить атрибуты папок, которые Вы хотите обрабатывать, а остальные отсекать. Наверное, это легче.
Исправил решение в соответствии с предложением Busla. Отсекаются скрытые и системные папки.

батник подправил

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 02-05-2018 в 12:17.


Отправлено: 07:30, 02-05-2018 | #8


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


megaloman, конечно, костыльное: надо проверять один единственный бит, а не перечислять все мыслимые комбинации:
Код: Выделить весь код
if (FAttr & 16) { // это директория }
и к языку программирования это не имеет отношения - оно везде так

Attributes Property

Последний раз редактировалось Busla, 02-05-2018 в 11:55.

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:27, 02-05-2018 | #9


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Busla, мысль правильная, но выражена не вполне точно. Проверять надо не один единственный бит, а все биты. К языку программирования это также имеет отношение — надо использовать именно битовые логические операторы/функции, а не просто логические (там, где они отличаются).

Отправлено: 12:14, 02-05-2018 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - Как каталогизировать папки средствами JS ?

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - Node.js (JS+DB (на JSON) + VK_API nexagns72 Программирование и базы данных 0 22-09-2017 20:02
VBS/WSH/JS - Подскажите как копировать файлы js vitalijch Скриптовые языки администрирования Windows 0 25-03-2012 18:00
[решено] JS. Как установить onblur из JS? Sanchos Вебмастеру 2 04-07-2010 13:16
[решено] Перемещение папки Users и изменение букв дискам средствами WAIK alcatraz Автоматическая установка Windows 11 / 10 / 8 / 7 / Vista 10 28-02-2009 03:04
VBS/WSH/JS - как создать VBArray в JS? pva Скриптовые языки администрирования Windows 3 16-11-2008 21:21




 
Переход