Войти

Показать полную графическую версию : delete C:\*.* /exclude=zzz.lst ?


semiono
12-06-2009, 15:43
У меня на C: лежат файлы, к примеру -
/~ [папка]
/BOOT.INI
/NTDETECT.COM
/NTLDR

как мне удалить всё остальное исключив этот полезный контент?
вариант с батником если не трудно тоже пожалуйста, так как разные бывают задачи?

Creat0R
12-06-2009, 16:12
#include <File.au3>

_FileDeleteEx("C:\Folder", "*.*", "|BOOT.INI|NTDETECT.COM|NTLDR|")

Func _FileDeleteEx($sPath, $sMask, $sExclude_List="")
Local $aFiles = _FileListToArray($sPath, $sMask)

For $i = 1 To UBound($aFiles)-1
If $sExclude_List = "" Or Not StringInStr($sExclude_List, "|" & $aFiles[$i] & "|") Then _
FileDelete($sPath & "\" & $aFiles[$i])
Next
EndFunc

semiono
15-06-2009, 20:00
C:\Folder - это для чего? Какраз из этой папки и удаляет! Хотя я хотел папку как исключение.
Я переименовал C:\Folder в свой каталог винды C:\~ и скрипт снёс все потроха винды, что только смог :)
Хотя результат ожидался обратный.

Причём мусор всякий на диске C:\ так и остался не тронутым.

C:\~ (винда)
C:\Ultra$ISO
C:\BOOT.INI
C:\desktop.ini
C:\h2r3F.tmp
C:\h2r35.tmp
C:\h2r86.tmp
C:\New AutoIt v3 Script.au3
C:\NTDETECT.COM
C:\NTLDR
C:\PrePict.htm
C:\Rar$CM06.422
C:\Rar$SF06.203
C:\RECYCLED - это у меня файл ;-)
C:\z.cmd
C:\z.reg

beve
15-06-2009, 20:19
Хотя результат ожидался обратный »
Так внимательно разбирай пример CreatOR-a, $sExclude_List="" по-твоему для чего?

Creat0R
15-06-2009, 20:34
C:\Folder - это для чего? »
Это исходная папка, в которой нужно удалять всё кроме списка исключении. «C:\» как то не рискнул написать ;)

мусор всякий на диске C:\ так и остался не тронутым »
А функции ведь нужно указать что именно удалять, если используется C:\~, то при чём тут C:\?

Что именно нужно сделать? Удалить всё на диске C: кроме указанных файлов? подробнее задачу следует описывать...

semiono
15-06-2009, 21:52
Так внимательно разбирай пример CreatOR-a, $sExclude_List="" по-твоему для чего? »
Внешний лист исключений лучше бы не делать, а прямо описать в скрипте все исключения сразу.

А функции ведь нужно указать что именно удалять »


Если указать что удалять, то можно и батником. Надо указать наоборот то, что не следует удалять.


Я хотел удалить всё с диска C: кроме папки виндовс и загрузочных файлов.
Program Files и Documents and Settings у меня там нет.
Хотя не помешало бы обойти стороной корзину и system volume information, хотя у меня лично таких папок нет, и pagefile.sys тоже не плохо бы учесть, опять же на всякий случай, но можно и не учитывать. ;)

Creat0R
15-06-2009, 22:21
Внешний лист исключений лучше бы не делать, а прямо описать в скрипте все исключения сразу »
Это и есть список исключении!

Надо указать наоборот то, что не следует удалять »
Я к тому, что нужны явные указания, скрипт гадать не умеет.

Я хотел удалить всё с диска C: кроме папки виндовс и загрузочных файлов »

Вот значит скрипт, в переменной $sExclude_List указываем файлы и папки которые не нужно удалять (через разделитель |):

#include <File.au3>

$sExclude_List = "BOOT.INI|NTDETECT.COM|NTLDR|RECYCLED"
$sExclude_List = "|" & $sExclude_List & "|"

$sPath = "C:\Folder"
$aFiles = _FileListToArray($sPath, "*.*")

For $i = 1 To UBound($aFiles)-1
If Not StringInStr($sExclude_List, "|" & $aFiles[$i] & "|") Then
If StringInStr(FileGetAttrib($sPath & "\" & $aFiles[$i]), "D") Then
DirRemove($sPath & "\" & $aFiles[$i], 1)
Else
FileDelete($sPath & "\" & $aFiles[$i])
EndIf
EndIf
Next

«C:\Folder» заменяем на «C:\».

semiono
15-06-2009, 23:19
Else
FileSetAttrib($sPath & "\" & $aFiles[$i], "-RASHNOT")
FileDelete($sPath & "\" & $aFiles[$i])

А вот это было бы так лучше
$sPath = @SystemDrive :) а почему нету такого?

Помниться как в WinAPI я искал @WorkingDir, там это тоже через голову надо было перевернуться... lstrcat 0_0

Creat0R
15-06-2009, 23:45
почему нету такого? »
Есть, как нету?!

Помниться как в WinAPI я искал @WorkingDir »
А зачем? Если есть макрос, который тем же WinAPI и образуется.

semiono
16-06-2009, 00:11
Оффтопик... Пожалуйста!!

Код:
$InstallDir = RegRead("HKLM\Software\Native Instruments\AkoustikPiano","InstallDir")
$file = FileOpen($InstallDir & "\AkoustikPiano.reg", 10)
FileWrite($file, "Windows Registry Editor Version 5.00" & @CRLF & @CRLF)
FileWrite($file, "[HKEY_LOCAL_MACHINE\Software\Native Instruments\AkoustikPiano]" & @CRLF)
Мне надо в зависимости от @OSArch использовать Wow6432Node затычку:

если x86 WinXP то обычно HKLM\Software\Native Instruments.....
если x64 WinXP то так HKLM\Software\Wo6432Node\Native Instruments....

как можно такой код зделать? что вообще с этим @OSArch делать?
так чтоли
If @OSArch = 1 then... ???

И как лучше, два блока написать для разных архитектур, или зделать одну переменную $var под ветку реестра,
которую потом менять по условию?
Напишите полностью код? Если понятно конечно что я спрашиваю? :)
Да впринцыпе тут всё просто, в разных x86 x64 запись реестра может быть в разных местах,
и различием будет лишь Wo6432Node

Creat0R
16-06-2009, 00:16
как можно такой код зделать? »
If @OSArch = "x86" Then ...
В справке ведь оно всё написано.

semiono
16-06-2009, 00:41
Точно! Всё легко получилось, просто ифов понаставил как есть, я думал сложнее будет!
Кстати в хелпе мало написанно, я бы ещё долго думал, как If @OSArch = "x86" Then составить,
я бы комплексовал бы, как обычно кода боюсь.
If @OSArch = "x86" Then
$InstallDir = RegRead("HKLM\Software\Native Instruments\AkoustikPiano","InstallDir")
$file = FileOpen($InstallDir & "\AkoustikPiano.reg", 10)
FileWrite($file, "Windows Registry Editor Version 5.00" & @CRLF & @CRLF)
FileWrite($file, "[HKEY_LOCAL_MACHINE\Software\Native Instruments\AkoustikPiano]" & @CRLF)
FileWrite($file, """SYSTEMID""=" & $sysID & "" & @CRLF & @CRLF)
FileClose($file)
EndIf

If @OSArch = "x64" Then
$InstallDir = RegRead("HKLM\Software\Wow6432Node\Native Instruments\AkoustikPiano","InstallDir")
$file = FileOpen($InstallDir & "\AkoustikPiano.reg", 10)
FileWrite($file, "Windows Registry Editor Version 5.00" & @CRLF & @CRLF)
FileWrite($file, "[HKEY_LOCAL_MACHINE\Software\Wow6432Node\Native Instruments\AkoustikPiano]" & @CRLF)
FileWrite($file, """SYSTEMID""=" & $sysID & "" & @CRLF & @CRLF)
FileClose($file)
EndIf

Жалко что reg.exe export отдельные value не сохраняет в файл, а в InnoSetup даже RegRead не нашлось,
пришлось к AutoIt обращаться, как всегда только это и выручает!

Creat0R
16-06-2009, 00:55
я бы комплексовал бы, как обычно кода боюсь »
Нечего бояться, без эксперементов трудно (невозможно?) достичь желаемых результатов ;)

Что касается кода выше, то можно укоротить:


$sRegKeyName = ""

Switch @OSArch
Case "x86"
$sRegKeyName = "HKLM\Software\Native Instruments\AkoustikPiano"
Case "x64"
$sRegKeyName = "HKLM\Software\Wow6432Node\Native Instruments\AkoustikPiano"
EndSwitch

$InstallDir = RegRead($sRegKeyName, "InstallDir")

$sFile_Content = _
"Windows Registry Editor Version 5.00" & @CRLF & @CRLF & _
"[" & $sRegKeyName & "]" & @CRLF & _
'"SYSTEMID"=' & $sysID & @CRLF & @CRLF

$hFileOpen = FileOpen($InstallDir & "\AkoustikPiano.reg", 10)
FileWrite($hFileOpen, $sFile_Content)
FileClose($hFileOpen)

semiono
16-06-2009, 12:49
Это очень интересно! Очень хорошо!

; это зачем, пустая переменная?
$sRegKeyName = ""

; а как используется выключатель, ведь далее в коде ни @OSArch ни x86 нигде не встречается!?
; а понял, наверное ядро само уже подставляет всюду переменные когда имеется такой блок: (типа директивы)
Switch @OSArch
Case "x86"
$sRegKeyName = "HKLM\Software\Native Instruments\AkoustikPiano"
Case "x64"
$sRegKeyName = "HKLM\Software\Wow6432Node\Native Instruments\AkoustikPiano"
EndSwitch

$InstallDir = RegRead($sRegKeyName, "InstallDir")

$sFile_Content = _
"Windows Registry Editor Version 5.00" & @CRLF & @CRLF & _
"[" & $sRegKeyName & "]" & @CRLF & _
'"SYSTEMID"=' & $sysID & @CRLF & @CRLF
; я не ошибусь если именно тут < буду наращивать регфайл содержимое ещё?
; ато тестировать сразу сложно под две платформы, вообще мне такой код позарез всегда нужен!


$hFileOpen = FileOpen($InstallDir & "\AkoustikPiano.reg", 10)
FileWrite($hFileOpen, $sFile_Content)
FileClose($hFileOpen)

Creat0R
16-06-2009, 14:14
это зачем, пустая переменная »
Это объявление переменной.

как используется выключатель, ведь далее в коде ни @OSArch ни x86 нигде не встречается
Switch это как бы If, только тут мы делаем выбор, что совпадает с макросом. См. справку, дольше чем пару секунд, её нужно вызубрить, и потом заглядывать для подтверждения :) - Я до сих пор туда обращаюсь за помощью.

я не ошибусь если именно тут < буду наращивать регфайл содержимое ещё?
Нет, там можно добавлять строчки по аналогии первых (через разделитель & _).

semiono
17-06-2009, 15:04
Нет, там можно добавлять строчки по аналогии первых (через разделитель & _). »
я догадался! Подчёркивание это перенос строки! & _ (в хелпе лично я это так и не нашёл)

Creat0R, мне очень помогло использование Switch для архитектуры.
Я это буду применять относительно всего кода. Но посмотри, всё ли правильно, нельзя ли оптимизировать?
Так как много реестр записей может быть, то получается много свитчеров каждый из которых занимает по шесть строк.
Хотя я лично думаю что это никак не изменишь наверное. Ну тогда и так хорошо.
И ещё, я решил это вначале кода писать, так как это полюбому глобально для всей программы.
Вот пример, всё ли правильно? Или сократить можно?
#Include <Clipboard.au3>
#include <GuiTab.au3>

Switch @OSArch
Case "x86"
$sRegApps = "HKEY_LOCAL_MACHINE\Software\Native Instruments\AkoustikPiano"
Case "x64"
$sRegApps = "HKEY_LOCAL_MACHINE\Software\Wow6432Node\Native Instruments\AkoustikPiano"
EndSwitch

Switch @OSArch
Case "x86"
$sRegVSTs = "HKEY_LOCAL_MACHINE\Software\VST"
Case "x64"
$sRegVSTs = "HKEY_LOCAL_MACHINE\Software\Wow6432Node\VST"
EndSwitch

RegDelete($sRegApps,"KEY")
RegDelete($sRegApps,"SNO")
RegDelete($sRegApps,"SYSTEMID")

ProgressOn("Running...","","")
ProgressSet(100)

BlockInput(1)

; далее тут работы с окном, в которых тоже используются переменные реестра
; так что тоже удобно $sRegApps, $sRegVSTs по архитектуре передавать.

BlockInput(0)

ProgressOff()

; тут практически твой код, только на два файла уже...

$sDir1 = RegRead($sRegApps, "InstallDir")

$sDir2 = RegRead($sRegVSTs, "VSTPluginsPath") & "\AkoustikPiano"

$sFile_Content = _
"Windows Registry Editor Version 5.00" & @CRLF & @CRLF & _
"[" & $sRegApps & "]" & @CRLF & _
'"SNO"="' & $SNO & '"' & @CRLF & _
'"SYSTEMID"="' & $sysID & '"' & @CRLF & _
'"KEY"="' & $KEY & '"' & @CRLF & @CRLF

$hFileOpen = FileOpen($sDir1 & "\AkoustikPiano.reg", 10)
FileWrite($hFileOpen, $sFile_Content)
FileClose($hFileOpen)

$hFileOpen = FileOpen($sDir2 & "\AkoustikPiano.reg", 10)
FileWrite($hFileOpen, $sFile_Content)
FileClose($hFileOpen)
Всё ли хорошо? Чтоб потом не переделывать, ато это как бы будет шаблон на много разных программ.

Есть идея, а нельзя ли свитчеры с описанием реестра x86_x64 вынести в инклюд - внешний скрипт?
Только так чтоб это было универсально, чтоб потом в самом коде можно было какугодно писать без проблем?
Да и сам инклюд чтоб можно было независимо наращивать, ключей добавлять?
Я практически наверное сам уже на это отвечаю, но может быть я не знаю чегото важного тут?

Creat0R
17-06-2009, 15:36
Вот пример, всё ли правильно? Или сократить можно? »
Можно, зачем например там два раза используется Switch @OSArch, в первом сравнение можно назначить нужные переменные:

Switch @OSArch
Case "x86"
$sRegApps = "HKEY_LOCAL_MACHINE\Software\Native Instruments\AkoustikPiano"
$sRegVSTs = "HKEY_LOCAL_MACHINE\Software\VST"
Case "x64"
$sRegApps = "HKEY_LOCAL_MACHINE\Software\Wow6432Node\Native Instruments\AkoustikPiano"
$sRegVSTs = "HKEY_LOCAL_MACHINE\Software\Wow6432Node\VST"
EndSwitch

И ещё, зачем длва раза записывать одно и то-же содержимое в файл, когда проще его скопировать:

$hFileOpen = FileOpen($sDir1 & "\AkoustikPiano.reg", 10)
FileWrite($hFileOpen, $sFile_Content)
FileClose($hFileOpen)

FileCopy($sDir1 & "\AkoustikPiano.reg", $sDir2 & "\AkoustikPiano.reg", 8+1)


нельзя ли свитчеры с описанием реестра x86_x64 вынести в инклюд - внешний скрипт? »
Не желательно, include поместит всё содержимое выводимого скрипта в начало (там где include вызывается), а присвоение динамических переменных желательно делать "на виду".

semiono
17-06-2009, 22:51
Можно, зачем например там два раза используется Switch »
Вот я ступил, действительно просто всё! Меня метки Case отвлекли, я думал их же нельзя сменить,
а сам контент как возможность какраз таки и проморгал.
А с копированием тоже хорошая идея, хотя я и подумаю, но наверное она лучше конечно!
присвоение динамических переменных желательно делать "на виду". »
ну код вобщем-то обозримый, хотя с этими сокращениями уже видимо не стоит.




© OSzone.net 2001-2012