Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

batch скрипт find and copy to usb flash, if exist

Featured Replies

Искам малко идеи относно скриптче: Идеята е следната-При стартиране на скриптчето да засича включените USB флаш дискове/USB твърди дискове и ако бъдат открити такива определена директория да бъде копирана на съответното устройство. Смятам това скриптче да бъде активно през цялото време в паметта и да търси USB устройства през определен интервал от време, чак когато намери такова да преминава към копиране на директорията(за back-up цели). Цялата тази игричка е понеже на различни компютри буквите на USB флаш дисковете/USB твърдите дискове може да бъдат различни, за това задаването на твърдо фиксирана буква никаква работа не ми върши. IF EXIST работа не ми върши, понеже е бавен и дърварски метод.

"скриптче да бъде активно през цялото време в паметта и да търси USB устройства през определен интервал от време" - това няма как да се постигне без използване на допълнителна програма. Мисля, че една услуга на Windows, която ще е активна дори и да няма логнат потребител, е много по-добро решение. Откриването на правилното устройство за архивиране (защото в даден момент, могат да бъдат свързани повече от едно), може да се извършва по етикета на диска. Предварително въведени етикети ще бъдат използвани за идентифициране на архивния диск.

...

Напротив, бях намерил скрипт, който правеше нещо подобно-откриваше устройството-марка и т.н.

Искам да намеря преносимият диск и да го задам като променлива. Не ми трябва лейбъл на диска, а да работи с който и да е диск.

Трябва да се четат ключове в регистрито и т.н, за да стане, но не е лесна задачка.

Е, не е batch скрипт, но е много близо и работи. Windows Shell Script-а е безусловно достъпен за всички Windows базирани операционни системи от Windows 98 (включително) насам.

//Път към директорията, чието съдържание ще копираме
var sourceFolderName = "c:\\photo1";

//Път към директорията, в която ще бъде създадено копието
//Този път не притежава буква - дисков идентификатор
//По-късно в скрипта, буквата ще бъде добавена за всеки Removable диск
var targetFolderName = ":\\photo1";

//Константи идентифициращи различните дискови типове
var DriveType_Unknown = 0;
var DriveType_Removable = 1;
var DriveType_Fixed = 2;
var DriveType_Network = 3;
var DriveType_CDRom = 4;
var DriveType_RamDisk = 5;

// Инициализираме изходния статус код със стойност "Няма грешка"
var exitCode = 0;

try
{
	//Създава FileSystemObject
	var fso = new ActiveXObject("Scripting.FileSystemObject");

	//Проверява дали source директорията съществува
	if (!fso.FolderExists(sourceFolderName))
	{
		throw new Error(10001, "Invalid source folder name.");
	}

	//Извлича списъка с текущо активните дискове
	var drives = new Enumerator(fso.Drives);

	//Енумерира списъка от дискове
	for (; !drives.atEnd(); drives.moveNext())
	{
	  var drive = drives.item();
	  
	  //Проверява дали диска е достъпен, от тип Removable
	  if ((drive.IsReady) && 
		  (drive.DriveType == DriveType_Removable))
	  {
		//Копира желаните файлове на подвижния дивайс
		fso.CopyFolder(sourceFolderName, drive.DriveLetter + targetFolderName, true);
	  }
	}
}
catch (e)
{
	//Изписва откритата грешка на екрана в StdErr конзолата
	//Позволява да се направи разбор от външен скрипт и да се предприеме действие
	WScript.StdErr.WriteLine(e.description);
	
	//Присвоява номера на откритата грешка на изходния статус код
	//Позволява да се направи разбор от външен скрипт и да се предприеме действие
	exitCode = e.number;
}

if (exitCode == 0)
{
	//Издаваме съобщение за правилно изпълнена задача
	WScript.StdOut.WriteLine("The operation has been successfully completed");
}

//Изход от скрипта с текущия статус код
WScript.Quit(exitCode);

Копираш скриптчето и го слагаш във файл с разширението .js (примерно в c:\drives.js). Стартира се с помощта на конзолния шел скрипт интерпретатор.

CScript "c:\drives.js"

Този команден ред може да бъде лесно вграден в друг batch скрипт и да бъде обработен изходния му код на грешка или просто да бъде вграден като задача в стандартния Windows Scheduler, за да бъде изпълняван през желания интервал от време...

Принципно, не би трябвало да има разлика. Всичко което се появява в зелената иконка в SysTray-а, разпознато като Mass Storage, минава за Removable дивайс. Утре ще извадя един USB енкложър и ще тествам и с него.

Лично аз бях се мъчил с преработката на този скрипт.

Засича устройството, дава ти лейбъл и прочие. Извежда ти буквата, но исках да го направя автоматичен и да се сетва изведената буква като променлива.

@echo off
if "%~1"=="/?" (
    goto :eof
)

setlocal


set lowdrive=
set driveexclude=
if /i "%~1"=="/all" (
    set lowdrive=b a
) else (
    set driveexclude=^^^|find /v /i "a:"^^^|find /v /i "b:"
)


set "svr=................................ !""#$%%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~................................................................................................................................."

:begin
SETLOCAL ENABLEDELAYEDEXPANSION
SET EL=0
SET ELT=
set svr=!svr:""="!
cls
echo.&echo.&echo.&echo.&echo.
echo:                   Scanning for usb flash drives.......
set dcnt=
ver|find "n 5">nul&&goto nt5
for /f "delims=" %%V in ('2^>nul reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR^|find /i "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR\"') do (
	for /f "delims=" %%W in ('2^>nul reg query "%%V"^|find /i "%%V\"') do (
		set flshtmp="%%W"
		set flshtmp=!flshtmp:%%V\=!
		for /f "tokens=1,2*" %%X in ('2^>nul reg query "%%W"^|find /i "FriendlyName"') do (
			set /a dcnt+=1			
			set fname!dcnt!="%%Z"
			set id!dcnt!=!flshtmp!
			set flshtmp=
		)
	)
)
goto merge

:nt5
for /f "delims=" %%V in ('2^>nul reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR^|find /i "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR\"') do (
	for /f "delims=" %%W in ('2^>nul reg query "%%V"^|find /i "%%V\"') do (
		set /a dcnt+=1
		set chk=0
		for /f "tokens=1,2*" %%X in ('2^>nul reg query "%%W"^|findstr /i "ParentIdPrefix FriendlyName"') do (
			if /i "%%X"=="ParentIdPrefix" set id!dcnt!="%%Z"&&set /a chk+=1
			if /i "%%X"=="FriendlyName" set fname!dcnt!="%%Z"&&set /a chk+=1
		)
		if !chk! lss 2 set /a dcnt-=1
	)
)

:merge
set lcnt=
for /f "tokens=2,4 delims=\	 " %%Y in ('reg query HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices^|find ":"%driveexclude%') do (
	2>&1 dir %%Y\|>nul find /i "volume" && (
		set /a lcnt+=1
		set drvltt!lcnt!=%%Y
		set drvdat!lcnt!=%%Z
	)
)
for /l %%W in (1,1,!lcnt!) do (
	set tdat=
	call :delin %%W
	set drvdat%%W=!drvdat%%W:00ј=!
	set drvdat%%W=!drvdat%%W:ј00=!
	set hexval=!svr!
	for %%X in (0 1 2 3 4 5 6 7 8 9 a b c d e f) do (
		for %%Y in (0 1 2 3 4 5 6 7 8 9 a b c d e f) do (
			for /f "delims=" %%Z in ("!hexval:~0,1!") do set drvdat%%W=!drvdat%%W:%%X%%Y=%%Z!
			set hexval=!hexval:~1!
		)
	)
	set drvdat%%W=!drvdat%%W:ј=!
)
set output1=Exit
set output2=Rescan to detect newly connected devices.
set fcnt=2
for /l %%W in (1,1,!dcnt!) do (
	for /l %%X in (1,1,!lcnt!) do (
		echo "!drvdat%%X!"|find !id%%W!>nul&& (
			set lbl=
			for /f "tokens=5*" %%Y in ('2^>nul vol !drvltt%%X!^|find /v /i "Volume Serial Number is"^|find /v /i "has no label"') do set lbl=, Label "%%Z"
			set /a fcnt+=1
			set itmed!fcnt!=Drive "!drvltt%%X!", Device !fname%%W!!lbl!
		)
	)
)
set srtcnt=!fcnt!
for %%Y in (z y x w v u t s r q p o n m l k j i h g f e d c %lowdrive%) do (
	for /l %%Z in (3,1,!fcnt!) do (
		if /i "%%Y"=="!itmed%%Z:~7,1!" (
			set output!srtcnt!=!itmed%%Z!
			set /a srtcnt-=1
		)

	)
)
cls

:loop
echo.&echo.&echo: Your options are.....&echo.
for /l %%Z in (1,1,!fcnt!) do echo: %%Z. !output%%Z!
echo.
set /p fdrive= Please select a flash drive or option: 
for /l %%Z in (1,1,!fcnt!) do if "%%Z"=="!fdrive!" goto finish
cls
echo Invalid choice - select again
goto loop

:finish
if /i "!output%fdrive%!"=="exit" (
	ENDLOCAL
        endlocal
	exit /b
)
if /i "!output%fdrive%!"=="Rescan to detect newly connected devices." (
	ENDLOCAL
	GOTO BEGIN
)

set fdrive=!output%fdrive%:~7,2!
(
	endlocal
	endlocal
	set fdrive=%fdrive%
	echo You selected drive %fdrive%
)
pause
goto :eof

:delin
if not defined drvdat%1 set drvdat%1=%tdat:~1%&&goto :eof
set tdat=%tdat%ј!drvdat%1:~0,2!
set drvdat%1=!drvdat%1:~2!
goto delin

Ето го! Тестван - с USB Flash Drive, USB Disk Drive, MMC/SD Flash Card и Sony Memory Stick. Не съм го тествал с Bluetooth и Firewire дивайси щото нямам под ръка. Най-вероятно няма да работи за тях, но лесно може да се модифицира. В документацията на WMI интерфейса, пише че работи гарантирано на Windows 2000 и нагоре, но съм тествал само на Windows 7. Това, което може да се добави е малко повече логика за проверка, дали има достатъчно място за да се копират файловете на дивайса, да се добавят параметри за стартиране на скрипта и разни други красоти. При интерес мога да посоча ресурси. Не е тествано в user mode. Командната линия е същата. Пиши тук ако не работи правилно.

//Директорията, чието съдържание ще копираме
var sourceFolderName = "c:\\photo1";

//Директорията, в която ще бъде създадено копието
//Тази директория не притежава буква - дисков идентификатор
//По-късно във скрипта буквата ще бъде добавена за всеки Removable диск
var targetFolderName = "\\photo1";

// Инициализираме изходния статус код със стойност "Няма грешка"
var exitCode = 0;

try
{
	//Създава FileSystemObject
	var fso = new ActiveXObject("Scripting.FileSystemObject");

	//Проверява дали директорията източник съществува
	if (!fso.FolderExists(sourceFolderName))
	{
		throw new Error(10001, "Invalid source folder name.");
	}

	//Създава WMI локатора
	var wbemLocator = new ActiveXObject("WbemScripting.SWbemLocator");

	//Свързва WMI локатора към локалната машина
	var wmiService = wbemLocator.ConnectServer(".", "/root/CIMV2");

	//Извлича информацията за наличните USB диск драйвове
	var diskDrives = new Enumerator(wmiService.ExecQuery("SELECT * FROM Win32_DiskDrive WHERE InterfaceType = 'USB'"));

	for(; !diskDrives.atEnd(); diskDrives.moveNext())
	{
		var diskDrive = diskDrives.item();
		
		//Извлича наличните партишъни свързани към текущия драйв 
		var diskPartitions = new Enumerator(wmiService.ExecQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" + diskDrive.DeviceID + "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition"));
		
		for(; !diskPartitions.atEnd(); diskPartitions.moveNext())
		{
			var diskPartition = diskPartitions.item();

			//Извлича наличните логически утройства свързани към текущия партишън
			var logicalDisks = new Enumerator(wmiService.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" + diskPartition.DeviceID + "'} WHERE AssocClass = Win32_LogicalDiskToPartition"));
			
			for(; !logicalDisks.atEnd(); logicalDisks.moveNext())
			{
				var logicalDisk = logicalDisks.item();
				
				//Копира файловата структура от изходната директория в директорията на текущия логически диск
				fso.CopyFolder(sourceFolderName, logicalDisk.DeviceID + targetFolderName, true);
			}
		}
	}
}
catch (e)
{
	//Изписва откритата грешка на екрана в StdErr конзолата
	//Позволява да се направи разбор от външен скрипт и да се предприеме действие
	WScript.StdErr.WriteLine(e.description);
	
	//Присвоява номера на откритата грешка на изходния статус код
	//Позволява да се направи разбор от външен скрипт и да се предприеме действие
	exitCode = e.number;
}

if (exitCode == 0)
{
	//Издаваме съобщение за правилно изпълнена задача
	WScript.StdOut.WriteLine("The operation has been successfully completed");
}

//Изход от скрипта с текущия статус код
WScript.Quit(exitCode);

....

Скриптът реално работи. Потвърждавам. Горният batch който дадох караше процесора на системата да бъде на 100% известно време, този скрипт се изпълнява много по-леко.

Благодаря. :D

Редактирано от Гост (преглед на промените)

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    32%
    Дарени 315 € от нужните 1 000 €

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.