Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   delete C:\*.* /exclude=zzz.lst ? (http://forum.oszone.net/showthread.php?t=142511)

semiono 12-06-2009 15:43 1141691

delete C:\*.* /exclude=zzz.lst ?
 
У меня на C: лежат файлы, к примеру -
/~ [папка]
/BOOT.INI
/NTDETECT.COM
/NTLDR

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

Creat0R 12-06-2009 16:12 1141714

Код:

#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 1144076

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 1144083

Цитата:

Цитата semiono
Хотя результат ожидался обратный »

Так внимательно разбирай пример CreatOR-a, $sExclude_List="" по-твоему для чего?

Creat0R 15-06-2009 20:34 1144093

Цитата:

Цитата semiono
C:\Folder - это для чего? »

Это исходная папка, в которой нужно удалять всё кроме списка исключении. «C:\» как то не рискнул написать ;)

Цитата:

Цитата semiono
мусор всякий на диске C:\ так и остался не тронутым »

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

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

semiono 15-06-2009 21:52 1144151

Цитата:

Цитата beve
Так внимательно разбирай пример CreatOR-a, $sExclude_List="" по-твоему для чего? »

Внешний лист исключений лучше бы не делать, а прямо описать в скрипте все исключения сразу.

Цитата:

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


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


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

Creat0R 15-06-2009 22:21 1144175

Цитата:

Цитата semiono
Внешний лист исключений лучше бы не делать, а прямо описать в скрипте все исключения сразу »

Это и есть список исключении!

Цитата:

Цитата semiono
Надо указать наоборот то, что не следует удалять »

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

Цитата:

Цитата semiono
Я хотел удалить всё с диска 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 1144230

Код:

Else
        FileSetAttrib($sPath & "\" & $aFiles[$i], "-RASHNOT")
        FileDelete($sPath & "\" & $aFiles[$i])

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

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

Creat0R 15-06-2009 23:45 1144249

Цитата:

Цитата semiono
почему нету такого? »

Есть, как нету?!

Цитата:

Цитата semiono
Помниться как в WinAPI я искал @WorkingDir »

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

semiono 16-06-2009 00:11 1144274

Оффтопик... Пожалуйста!!

Код:
Код:

$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 1144279

Цитата:

Цитата semiono
как можно такой код зделать? »

If @OSArch = "x86" Then ...
В справке ведь оно всё написано.

semiono 16-06-2009 00:41 1144302

Точно! Всё легко получилось, просто ифов понаставил как есть, я думал сложнее будет!
Кстати в хелпе мало написанно, я бы ещё долго думал, как 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 1144312

Цитата:

Цитата semiono
я бы комплексовал бы, как обычно кода боюсь »

Нечего бояться, без эксперементов трудно (невозможно?) достичь желаемых результатов ;)

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

Код:

$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 1144600

Это очень интересно! Очень хорошо!

; это зачем, пустая переменная?
$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 1144691

Цитата:

Цитата semiono
это зачем, пустая переменная »

Это объявление переменной.

Цитата:

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

Цитата:

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

semiono 17-06-2009 15:04 1145084

Цитата:

Цитата Creat0R
Нет, там можно добавлять строчки по аналогии первых (через разделитель & _). »

я догадался! Подчёркивание это перенос строки! & _ (в хелпе лично я это так и не нашёл)

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 1145128

Цитата:

Цитата semiono
Вот пример, всё ли правильно? Или сократить можно? »

Можно, зачем например там два раза используется 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)

Цитата:

Цитата semiono
нельзя ли свитчеры с описанием реестра x86_x64 вынести в инклюд - внешний скрипт? »

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

semiono 17-06-2009 22:51 1145492

Цитата:

Цитата Creat0R
Можно, зачем например там два раза используется Switch »

Вот я ступил, действительно просто всё! Меня метки Case отвлекли, я думал их же нельзя сменить,
а сам контент как возможность какраз таки и проморгал.
А с копированием тоже хорошая идея, хотя я и подумаю, но наверное она лучше конечно!
Цитата:

Цитата Creat0R
присвоение динамических переменных желательно делать "на виду". »

ну код вобщем-то обозримый, хотя с этими сокращениями уже видимо не стоит.


Время: 10:28.

Время: 10:28.
© OSzone.net 2001-