1 (изменено: madjahed, 2017-11-16 09:23:39)

Тема: WSH. Копирование на usb (добавить обработку подпапок)

Добрый день. Имею JS скрипт вида:

+ открыть спойлер
var BackupFName = "F:\\Statistika\\Недельная\\"; 
var WshShell=WScript.CreateObject("WScript.Shell"); 
var WshSpecialFolders=WshShell.SpecialFolders; 
var UserName=WshNet.UserName; 
   { 
      var SpecFldr, i; 
      SpecFldr= new Array(2); 
      SpecFldr[0]="Desktop"; 
      SpecFldr[1]="MyDocuments"; 

      for (i=0;i<SpecFldr.length;i++) 
      { 
         var UsersMyDocsFName="\"" + WshSpecialFolders(SpecFldr[i])+ "\""; 
         var UserBackupFName="\""+BackupFName+UserName+"\\"+SpecFldr[i]+"\"" 
         //WScript.Echo("xcopy /c /d /e /i /y "+UsersMyDocsFName+" "+UserBackupFName); 
         WshShell.Run("%COMSPEC% /c if not exist "+UserBackupFName+" md "+UserBackupFName, 0, true); 
         WshShell.Run("xcopy /c /d /e /i /y "+UsersMyDocsFName+" "+UserBackupFName,0, true); 
      } 
   }

Скрипт в данном варианте запускается в юсб флешки и копирует все файлы с рабочего стола и моих документов в указанную папку на флешке.
Требуется доработать:
1. Копировать только файлы с разширением *.bak, *.old, *.ini
2. Указать относительный путь для копирование файлов на флешке, так как при подключении на разных пк назначаемая буква диска разная и вариант с F:\Statistika\Недельная\ не срабатывает так как диска F: нету
Заранее спасибо за помощь

2

Re: WSH. Копирование на usb (добавить обработку подпапок)

Может, это сгодится? JScript: копирование файлов с заданными расширениями.

3

Re: WSH. Копирование на usb (добавить обработку подпапок)

YMP Предложенный вами скрипт не решает вопрос с диском юсб флешки, плюс нужно явно указывать папки для копирования, в моем случае это рабочий стол и мои документы, а путь к ним для разных пользователей разный

4

Re: WSH. Копирование на usb (добавить обработку подпапок)

Точно не решает? По-моему, там можно указать относительный путь для папки назначения.

5 (изменено: Rumata, 2017-09-19 15:35:17)

Re: WSH. Копирование на usb (добавить обработку подпапок)

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

Для копирования некоторых специфических, но стандартных источников (Рабочий стол, Мои документы) текущего пользователя тоже не представляется сложным. Надо прочитать либо соответствующие переменные окружения, либо "спросить" систему на предмет указанных каталогов. Что-то вроде, WSH.Environment WSH.GetSystemFolder. Точно не помню - надо смотреть в документации.

( 2 * b ) || ! ( 2 * b )

6

Re: WSH. Копирование на usb (добавить обработку подпапок)

Rumata C этой целью и разместил пост. Так как сам я подобными навыками не обладаю(
Чтобы люди которые в этом разбираются где-то чего-то подправили в уже существующем (или если удобнее другом - не принципиально) скрипте чтобы
1) Копировать только файлы с разширением *.bak, *.old, *.ini с Рабочего стола и Моих документов (путь указать как спец папку, запускаться будет на более 30 машинах с разными пользователями)
2) Указать папку для копирование файлов относительно скрипта на флешке (так как при подключении на разных пк назначаемая буква диска разная и вариант с F:\Statistika\Недельная\ не срабатывает так как диска F: нету)

7 (изменено: madjahed, 2017-09-21 19:39:03)

Re: WSH. Копирование на usb (добавить обработку подпапок)

ну или как вариант есть скрипт vbs

+ открыть спойлер
Set WshShell = CreateObject("WScript.Shell") 
Set SpecialFolders = WshShell.SpecialFolders 
FolderPath = SpecialFolders.Item("Desktop") 
Dim MyPath,f,f1,fc,ext
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WshShell = WScript.CreateObject("WScript.Shell")
set f = fso.GetFolder(FolderPath)
set fc = f.Files
MyPath = left (WScript.ScriptFullName, (Len(WScript.ScriptFullName))-(Len(WScript.ScriptName)))
MyPath1 = MyPath+"Статистика"
for each f1 in fc
ext=lcase(fso.GetExtensionName(f1.path))
if (ext="bak") or (ext="old") or (ext="ini") then
FSO.CopyFile f1.path, MyPath1 & "\" 
end if
next

Но данный скрипт не обрабатывает подпапки

8

Re: WSH. Копирование на usb (добавить обработку подпапок)

так может кто поможет отредактировать скрипт :

var BackupFName = "F:\\Statistika\\Недельная\\"; 
var WshShell=WScript.CreateObject("WScript.Shell"); 
var WshSpecialFolders=WshShell.SpecialFolders; 
var UserName=WshNet.UserName; 
   { 
      var SpecFldr, i; 
      SpecFldr= new Array(2); 
      SpecFldr[0]="Desktop"; 
      SpecFldr[1]="MyDocuments"; 

      for (i=0;i<SpecFldr.length;i++) 
      { 
         var UsersMyDocsFName="\"" + WshSpecialFolders(SpecFldr[i])+ "\""; 
         var UserBackupFName="\""+BackupFName+UserName+"\\"+SpecFldr[i]+"\"" 
         WshShell.Run("%COMSPEC% /c if not exist "+UserBackupFName+" md "+UserBackupFName, 0, true); 
         WshShell.Run("xcopy /c /d /e /i /y "+UsersMyDocsFName+" "+UserBackupFName,0, true); 
      } 
   }

чтобы :
1. Копировать только файлы с разширением *.bak, *.old, *.ini
2. Указать относительный путь для копирование файлов на флешке, так как при подключении на разных пк назначаемая буква диска разная и вариант с F:\Statistika\Недельная\ не срабатывает так как диска F: нету
Заранее спасибо за помощь

9

Re: WSH. Копирование на usb (добавить обработку подпапок)

Проверьте:


// Константы для методов объекта Shell.Application
var ssfDESKTOP				= 0x00,
	ssfPERSONAL				= 0x05,
	SHCONTF_NONFOLDERS		= 0x00040,
	SHCONTF_INCLUDEHIDDEN	= 0x00080,
	
	// Объект для работы с файловой системой
	shell = new ActiveXObject('Shell.Application'),
	// Каталоги, которые предстоит перебрать
	specialFolders = [ssfDESKTOP, ssfPERSONAL],
	// Получение текущего каталога запуска в виде объектной модели
	currentFolder = shell.NameSpace(WScript.ScriptFullName.replace(/[^\/\\]+$/, '')),
	// Путь для копирования
	backupFolder = 'Statistika\\Недельная\\',
	// Переменная для размещения коллекции элементов каталога
	items;
	
// Создание пути (с подкаталогами), если таковой не существует
currentFolder.NewFolder(backupFolder);
// Получение текущего каталога как объектной модели folderItem
currentFolder = shell.NameSpace(currentFolder.parseName(backupFolder));
// Перебор каталогов рабочего стола и документов
for(var i in specialFolders){
	// Получение набора элементов в каталоге
	items = shell.NameSpace(specialFolders[i]).Items();
	// Фильтрация элементов не являющимися каталогами и скрытых по маскам 
	items.filter(SHCONTF_NONFOLDERS || SHCONTF_INCLUDEHIDDEN,'*.bak; *.old; *.ini');
	// копирование файлов с заменой без запроса
	currentFolder.CopyHere(items,16);
}

Честно говоря, не понимаю потребности в написании JS скрипта для этих целей. Почему Вы не хотите воспользоваться BAT / CMD файлом в несколько строк для этих же целей ?

В самом простом линейном варианте:


@echo off
chcp 1251 > nul 
set BACKUP_FOLDER=Statistika\Недельная
if not exist %BACKUP_FOLDER% mkdir %BACKUP_FOLDER%
copy %USERPROFILE%\Desktop\*.bak %BACKUP_FOLDER% /Y
copy %USERPROFILE%\Desktop\*.old %BACKUP_FOLDER% /Y
copy %USERPROFILE%\Desktop\*.ini %BACKUP_FOLDER% /Y

copy %USERPROFILE%\Documents\*.bak %BACKUP_FOLDER% /Y
copy %USERPROFILE%\Documents\*.old %BACKUP_FOLDER% /Y
copy %USERPROFILE%\Documents\*.ini %BACKUP_FOLDER% /Y
pause
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

10 (изменено: madjahed, 2017-10-18 06:56:07)

Re: WSH. Копирование на usb (добавить обработку подпапок)

Xameleon
Спасибо за помощь.
Предложенный вами скрипт не обрабатывает подпапки и не копирует файлы из Мои Документы.
Система Windows 7 x64, возможно проблема в том что папка Мои Документы - переназначена и находится не на системном диске. Через WshSpecialFolders=WshShell.SpecialFolders "MyDocuments" ведет к "C:\Users\Администратор\Documents", а вот если зайти через Пуск-Документы, то попадаю куда нужно - "Библиотеки\Документы", может и к библиотеке можно обратиться как к спецпапке?
Удалось нагуглить что библиотека FOLDERID_DocumentsLibrary имеет путь "%APPDATA%\Microsoft\Windows\Libraries\Documents.library-ms". Попытался подставить в Ваш скипт строчку ssfPERSONAL = %APPDATA%\Microsoft\Windows\Libraries\Documents.library-ms, но не вышло(( Покурил еще немного и я так понял пути вида %APPDATA% нужно указывать с помощью ExpandEnvironmentStrings(), но я для этого тупой, не вышло((

11 (изменено: madjahed, 2017-10-18 08:17:57)

Re: WSH. Копирование на usb (добавить обработку подпапок)

Xameleon, удалось привести Ваш скрипт к виду:

WshShell = WScript.CreateObject("WScript.Shell");
with(WshShell){
var list1= ExpandEnvironmentStrings("%APPDATA%") + '\\Microsoft\\Windows\\Libraries\\Documents.library-ms\\';
}
	var ssfDESKTOP = 0x00, ssfPERSONAL = 0x05, SHCONTF_NONFOLDERS = 0x00040, SHCONTF_INCLUDEHIDDEN = 0x00080,
	shell = new ActiveXObject('Shell.Application'),
	specialFolders = [ssfDESKTOP, ssfPERSONAL, list1],
	currentFolder = shell.NameSpace(WScript.ScriptFullName.replace(/[^\/\\]+$/, '')),
	backupFolder = 'Statistika\\Недельная\\',
	items;
currentFolder.NewFolder(backupFolder);
currentFolder = shell.NameSpace(currentFolder.parseName(backupFolder));
for(var i in specialFolders){
	items = shell.NameSpace(specialFolders[i]).Items();
	items.filter(SHCONTF_NONFOLDERS || SHCONTF_INCLUDEHIDDEN,'*.bak, *.old, *.ini');
	currentFolder.CopyHere(items,16);
}

можете добавить обработку подпапок рабочего стола и моих документов?

12

Re: WSH. Копирование на usb (добавить обработку подпапок)

madjahed
1) Изначально Вы не указывали, что требуется перебор по подкаталогам. Возникает встречный вопрос - Что делать с файлами, которые имеют одно и тоже имя, но лежат в разных подкаталогах ? Пример:

\1.bak
\data\data\1.bak

В таком случае вы хотите копировать файлы вместе с подкаталогами, дублируя дерево в конечной папке ?

2) Вы уверены, что у Вас эти пути ведут к разным каталогам ? ssfPERSONAL позвоялет получить путь именно к документам текущего пользователя (и возвращаемое значение учитывает переназначения, на сколько мне известно) - справка по константам Shell.Application

Если же у Вас существует разница, то надо разобраться чьи же документы Вы тогда перебираете ?

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

13 (изменено: madjahed, 2017-10-18 14:41:46)

Re: WSH. Копирование на usb (добавить обработку подпапок)

Xameleon, 1)ну если это для Вас не сильно сложно, то можно и продублировать дерево, а так при повторении имен файлов в Вашем скрипте достаточно заменить currentFolder.CopyHere(items,16) на currentFolder.CopyHere(items,24) чтобы файлы переименовывались.
2) да, проверил, папка документов которая открывается через Пуск - ведет в другое место, в библиотеку, в которой находятся папки из разных источников, а если по имени спецпапки - то да, имя пользователя мое, там всего то один пользователь - C:\Users\madjahed\Documents, но там лежат совершенно не те файлы. Попробуйте у себя в адресной строке вбить сначала %USERPROFILE%\Documents, а затем %APPDATA%\Microsoft\Windows\Libraries\Documents.library-ms, у меня они ведут в разные места.

14

Re: WSH. Копирование на usb (добавить обработку подпапок)

madjahed,

1) В таком случае, Вы можете обойтись одной коммандой с использованием robocopy.

robocopy "%USERPROFILE%\Desktop" "Stat\Weekly" "*.bak" "*.txt" "*.ini" /S

2) Каталог библиотек меня несколько озадачил. Ранее не имел опыта работы с ним, но то что Вы называете "другим каталогом", в действительности является лишь ссылкой. Другой вопрос ссылкой на что ?

Я попытался натравить robocopy на %APPDATA%\Microsoft\Windows\Libraries\Documents.library-ms но модуль сообщил, что такой каталог не найден.
Хорошо, я подсунул этот путь explorer-у и убедился, что он прекрасно открывается. Кстати,

madjahed пишет:

Попробуйте у себя в адресной строке вбить сначала %USERPROFILE%\Documents, а затем %APPDATA%\Microsoft\Windows\Libraries\Documents.library-ms, у меня они ведут в разные места.

У меня эти пути показывают идентичное содержимое. Т.е ведут на один и тот же каталог.

Далее я попробовал через dir зайти в каталог %APPDATA%\Microsoft\Windows\Libraries

+ открыть спойлер

https://imgur.com/FiQAzbL.png

И что мы видим - Documents.library-ms никакой не каталог, а файл

Решил посмотреть свойства:

+ открыть спойлер

https://i.imgur.com/7tSuBfk.png

Открыл содержимое:

+ открыть спойлер

https://i.imgur.com/4gAHDvV.png

Т.е проводник, зная как работать с этим файлом, показывает нам ссылку на совершенно иное содержимое. Остаётся выяснить, куда у Вас смотрит эта ссылка.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

15 (изменено: madjahed, 2017-10-18 16:28:40)

Re: WSH. Копирование на usb (добавить обработку подпапок)

Xameleon, ну ссылку удалось завернуть чтобы оттуда копировалось, и то хорошо. Ваш скрипт %APPDATA%\Microsoft\Windows\Libraries\Documents.library-ms обрабатывает и копирует, но не вложенные папки. А можно обработку подпапок прикрутить сюда? Пробовал сам, не выходит, что то я в циклах такого мучу что один файл дублируется бесконечно или вечно какие то синтаксические ошибки((((((((

16

Re: WSH. Копирование на usb (добавить обработку подпапок)

madjahed, Вы зря ломаете копья с javascript, если есть готовый удобный иснтрумент - robocopy. Нужно лишь выяснить, что за странности с путями библиотек.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

17 (изменено: madjahed, 2017-10-18 16:54:33)

Re: WSH. Копирование на usb (добавить обработку подпапок)

Xameleon, так робокопи не хочет эту %APPDATA%\Microsoft\Windows\Libraries\Documents.library-ms фигню обрабатывать, а скрипт может. Уж не знаю что я тут с этой библиотекой документов намутил, но может проще будет добавить обработку подпапок в скрипт который уже работает?

18

Re: WSH. Копирование на usb (добавить обработку подпапок)

madjahed пишет:

Xameleon, так робокопи не хочет эту %APPDATA%\Microsoft\Windows\Libraries\Documents.library-ms фигню обрабатывать, а скрипт может.

Логично, потому что нужно работать с конечным каталогом, а не с ссылкой на него.

madjahed пишет:

но может проще будет добавить обработку подпапок в скрипт который уже работает?

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

Выясните всё же - куда у Вас ведут пути.

P.S Как говорится: Лучше день потерять потом за пять минут долететь

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

19 (изменено: madjahed, 2017-10-19 08:20:06)

Re: WSH. Копирование на usb (добавить обработку подпапок)

Xameleon? Ну можно не дублировать дерево, а так при повторении имен файлов в Вашем скрипте заменить currentFolder.CopyHere(items,16) на currentFolder.CopyHere(items,24) чтобы файлы переименовывались. А на счет куда же ведет этот путь библиотеки - ума не приложу как так. Как то раньше не обращал внимания, но вот проверил вчера на работе на почти 20 ПК - и оказалось не такой это редкий случай, где то действительно обе ссылки показывают одно содержимое, но на других ПК таже история. Обратил внимание, что на тех ПК где содержимое этих ссылок различно, там у пользователей нет на рабочем столе служебной папки Мои документы, а если попробовать через свойства экрана ее отобразить там есть галочка напротив Файлы пользователя, а не Мои документы. Отчего это зависит пока не понял.

Xameleon пишет:

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

а если взять скрипт с уже готовой такой функцией и набросать в нее куски Вашего скрипта? Правда у меня это не вышло, нашел 4 скрипта с рекурсией и пытался подбросить туда нужный функционал - но что то как то тупой для этого(

20

Re: WSH. Копирование на usb (добавить обработку подпапок)

@echo off

setlocal enableextensions enabledelayedexpansion

robocopy "%USERPROFILE%\Desktop" "Stat\Weekly" "*.bak" "*.txt" "*.ini" /S

FOR /F "tokens=3" %%G IN ('REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') DO (SET Personal=%%G)

robocopy "%personal%" "Stat\Weekly" "*.bak" "*.txt" "*.ini" /S
pause

Ииии... Проверяем.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

21 (изменено: madjahed, 2017-10-19 15:07:19)

Re: WSH. Копирование на usb (добавить обработку подпапок)

Xameleon, добрый день, проверил. Есть пара нюансов:
1 - не обрабатывается моя загадочная Библиотека\Документы
2 - если файлы с одинаковым именем находятся и на рабочем столе и в моих документах, получаем в итоге только один файл, так как имена в конечной папке совпадают
Если со втором справится легко, просто указав  "Stat\Weekly\1" в 3-й строчке и "Stat\Weekly\2" в 5-й строчке например, то первую проблемку тоже очень бы хотелось решить. Ну не приложу ума почему на некоторых пк эти ссылки ведут в совершенно разные места, и как раз таки там где они отличаются, нужные мне файлы оказываются именно в %APPDATA%\Microsoft\Windows\Libraries\Documents.library-ms

22

Re: WSH. Копирование на usb (добавить обработку подпапок)

madjahed,
1) Так как раз здесь и происходит чтение пути, на который указывает %APPDATA%\Microsoft\Windows\Libraries\Documents.library-ms:


'REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"'

Вместо того, чтобы голову ломать, достаточно перейти по пути %APPDATA%\Microsoft\Windows\Libraries\, открыть свойства объекта "Документы", перейти на вкладку "Библиотека" и посмотреть куда ведёт путь.

+ открыть спойлер

https://imgur.com/PpQvQaO.png

2) Вот. Правильно мыслите. Нужно разделение на подкаталоги.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

23 (изменено: madjahed, 2017-10-19 16:55:23)

Re: WSH. Копирование на usb (добавить обработку подпапок)

Xameleon, да в том и дело - что значение которое мы берем из реестра ведет в  %USERPROFILE%\Documents, а %APPDATA%\Microsoft\Windows\Libraries\Documents.library-ms по факту в другое место и показывают они разные файлы. Ну не понимаю как так выходит на некоторых ПК

24

Re: WSH. Копирование на usb (добавить обработку подпапок)

madjahed,

madjahed пишет:

да в том и дело - что значение которое мы берем из реестра и %APPDATA%\Microsoft\Windows\Libraries\Documents.library-ms по факту показывают разные файлы.

Shell.Application использует ссылку(и) из этого файла, для получения списка содержимого документов. Других ссылок не существует.

В предыдущем своём сообщении я уже упомянул, ещё одну из рекомендаций. Не увидел Вашего ответа по этому поводу.

Вместо того, чтобы повторять:

madjahed пишет:

Ну не понимаю как так выходит на некоторых ПК

madjahed пишет:

Уж не знаю что я тут с этой библиотекой документов намутил

Можно было уже:
1) Провести поиск по интернету и изучить механизм работы библиотек. (пример)
2) Заглянуть в ветку реестра HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
.
3) Выбрать машину на которой происходит неправильное срабатывание и вычислить реальный путь файлов, открыв свойства и посмотрев "Расположение", или проведя поиск этих файлов по диску. И сравнить чем отличается "реальный" путь от "ошибочного".

Пока не вижу этих действий с Вашей стороны. Потому делаю паузу и жду Вашей инициативы. Так как не имею информации о том как воспроизвести подобную ситуацию у себя.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

25 (изменено: madjahed, 2017-10-19 18:18:36)

Re: WSH. Копирование на usb (добавить обработку подпапок)

Xameleon,
1) именно с помощью поиска по интернету и удалось найти ссылку на %APPDATA%\Microsoft\Windows\Libraries\Documents.library-ms
2) в ветке HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Personal имеет значение C:\Users\Пользователь\Documents
3) вот можете воочию убедится в этом:
здесь смотрим ссылку в реестре

+ открыть спойлер

https://i.imgur.com/43WwY10.png

переходим по ней

+ открыть спойлер

https://i.imgur.com/vWU8pJn.png

а здесь ссылка на %APPDATA%\Microsoft\Windows\Libraries\Documents.library-ms

+ открыть спойлер

https://i.imgur.com/xRvBMlh.png

Как можете увидить перечень файлов совершенно различный.
При поиске по диску - файлы фактически находятся там где и показано в библиотеке %APPDATA%\Microsoft\Windows\Libraries\Documents.library-ms , здесь, например, диск Д