Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Umějí dávkové soubory pracovat s atributy "šifrovaný" a "komprimovaný? Nebo je třeba užít skripty?

Dobré odpoledne, umí příkazový řádek ve Windows 2000/XP pracovat s atributy "šifrovaný" a "komprimovaný? Je možné napsat dávku, která by například vypsala všechny soubory s atributem "šifrovaný" ve složce C:\Test? Nebo se pro tento úkol musí použít nějaký skript? Může prosím někdo uvést příklad takové dávky/skriptu? Předem děkuji za váš čas.

Předmět Autor Datum
V PowerShellu to vypadá nějak takhle get-childitem c:\ | where {$_.Attributes -like "*Compressed*"}…
Mitch 27.01.2008 16:07
Mitch
Mitchi, děkuju za promptní odpověď. Teď jsem to zkoušel a vyhazuje to tuhle chybovou hlášku: Řádek:…
Laik 27.01.2008 16:57
Laik
No vcelku jo:-) Tohle není Jscript ale PowerShell, náhrada command lajny. Jestli nemáš tak musíš stá…
Mitch 27.01.2008 17:14
Mitch
To je trošku problém, protože PowerShell nefunguje na Win 2000, kde jsem to momentálně zkoušel. Potř…
Laik 27.01.2008 17:50
Laik
Zkus se podívat sem: 339 http://msdn2.microsoft.com/en-us/library/5tx15443.a spx http://www.aspfree.…
host 27.01.2008 18:12
host
Tak host to roseknul. WSH + WMI je ta správná volba:-)
Mitch 27.01.2008 20:25
Mitch
Děkuju za tipy, hoste. Předem se omlouvám za svou omezenost, ale řešení toho problému tam nějak nevi…
Laik 27.01.2008 23:10
Laik
Jakápak omezenost, žádný učený z nebe nespadl (touchwood je vyjímka :-p) Zkus to nějak takhle: Set…
host 27.01.2008 23:32
host
Jelikož Laik psal, že potřebuje ještě podporu pro atribut Encrypted, tak bych spíš použil skript z p…
Mitch 28.01.2008 00:04
Mitch
Mitchi, tvoji poznámku jsem si přečetl až po odeslání předchozí odpovědi. Máš tedy řešení i pro atri…
Laik 28.01.2008 00:14
Laik
Děkuju, hoste. Už si to pomalu začínám dávat dohromady. Pročítal jsem ty odkazy ještě jednou, ale ne…
Laik 28.01.2008 00:05
Laik
Moc jsem to do hloubky nestudoval, ale pochopil jsem to tak, že atribut "šifrovaný" neexistuje. Dá s…
host 28.01.2008 20:19
host
co to vidím? :-D
touchwood 29.01.2008 20:22
touchwood
blik! :-)
host 29.01.2008 20:25
host
OK tak sem překopíruju jeden z tech skriptů ' From the book "Windows XP Cookbook" ' ISBN: 059600725…
Mitch 29.01.2008 16:03
Mitch
Takže třeba tohle: strFilePath = "d:" WScript.Echo " Encrypted: " & objFile.Encrypted WScript.Echo…
Laik 29.01.2008 20:04
Laik
Ne. Ten skript je pro vypsání informací o jednom souboru. Pokud chceš projít všechny soubory v defi…
host 29.01.2008 20:13
host
A jak se taková smyčka vytváří? Jestli ji umíš vytvořit, mohl bys mně ten skript napsat? Můžeme zůst…
Laik 29.01.2008 20:36
Laik
Ukázku smyčky už jsem ti psal v předchozím příkladu for each...
host 29.01.2008 20:56
host
Takže třeba takhle? strFilePath = "d:" for each objFile in files WScript.Echo " Encrypted: " & objF…
Laik 29.01.2008 21:28
Laik
Než se pustíš do skriptování, měl bys projet aspoň základy:-) Skloubil jsem hostův kód s tím z odkaz…
Mitch 29.01.2008 23:07
Mitch
Perfektní, Mitchi. Funguje na Win 2000 i na XP. Můžu jen ještě poprosit o radu, jak to udělat, aby t…
Laik 30.01.2008 21:13
Laik
Podívám se na to o víkendu jestli to nějak nespěchá.
Mitch 01.02.2008 01:12
Mitch
v zásadě je potřeba napsat to rekurzivně (tj. udělat si funkci) a tou projíždět všechny adresáře, a…
touchwood 01.02.2008 06:36
touchwood
Set objWMI = GetObject("winmgmts:\\.\root\cimv2") Set fso = CreateObject("Scripting.FileSystemObject…
Mitch 02.02.2008 15:06
Mitch
Mitchi, smekám před tvými schopnostmi a jsem tvým (alespoň virtuálním) dlužníkem. Skript funguje na…
Laik 03.02.2008 22:12
Laik
proč si výstup nepřesměruješ do souboru? příklad: cscript c:\tester.vbs >c:\vysledek.txt
touchwood 04.02.2008 07:05
touchwood
Touchwoode, děkuju. Tím je můj problém vyřešen dokonale a se vším všudy. Ještě jednou děkuju všem, k… poslední
Laik 04.02.2008 20:23
Laik

V PowerShellu to vypadá nějak takhle

get-childitem c:\ | where {$_.Attributes -like "*Compressed*"}

// Edit: ještě seznam atributů

[Enum].GetValues([IO.FileAttributes])

ReadOnly
Hidden
System
Directory
Archive
Device
No r mal
Temporary
SparseFile
ReparsePoint
Compressed
O f fline
NotContentIndexed
Encrypted

Mitchi, děkuju za promptní odpověď. Teď jsem to zkoušel a vyhazuje to tuhle chybovou hlášku:

Řádek: 1
Znak: 15
Chyba: Byl očekáván znak ;
Chyba kompilace

Tvůj výše uvedený skript jsem uložil jako Skript.js a spustil přes příkazový řádek a Windows Script Host. Dělám něco špatně?

To je trošku problém, protože PowerShell nefunguje na Win 2000, kde jsem to momentálně zkoušel. Potřeboval bych nějaké "univerzální" řešení pro Windows 2000 i XP, které by se dalo podle potřeby používat na obou platformách. Proto mě napadl WSH.

Děkuju za tipy, hoste. Předem se omlouvám za svou omezenost, ale řešení toho problému tam nějak nevidím. Atribut "šifrovaný" je jen v tom prvním odkazu, v dalších ne. Protože o skriptování vím v zásadě jen to, že existuje, nějak si to asi neumím spojit. Jestli tam to řešení je, moc prosím o jeho vložení sem pokud možno přímo v aplikovatelné podobě.

Jakápak omezenost, žádný učený z nebe nespadl (touchwood je vyjímka :-p)

Zkus to nějak takhle:

Set fsoFolder = CreateObject("Scripting.FileSystemObject")
Set folder = fsoFolder.GetFolder("C:\Test")
Set files = folder.Files
for each objFile in files
sName = objFile.Name
If objFile.Attributes AND 2048 Then
  msgbox sName 
End If
next
set files = nothing
set folder = nothing
set fsoFolder = nothing

Mitchi, tvoji poznámku jsem si přečetl až po odeslání předchozí odpovědi. Máš tedy řešení i pro atribut "šifrovaný" nebo nejlépe řešení, které zvládne oba atributy? Pokud ano, budu vděčný za jeho uvedení zde, včetně těch detailů, na které se ptám v technické poznámce výše.

Děkuju, hoste. Už si to pomalu začínám dávat dohromady. Pročítal jsem ty odkazy ještě jednou, ale nenašel jsem tam to číslo pro atribut "šifrovaný" (jako je 2048 pro "komprimovaný"), protože ta čísla jsou právě v těch odkazech, kde se o atributu "šifrovaný" nepíše. Rozumím tomu tedy dobře, že tohle řešení se dá použít jen pro "komprimovaný" a ne pro "šifrovaný"?

A ještě technická poznámka. Mám to klasicky uložit jako .vbs nebo .js a pak spouštět poklepáním, nebo je nějaký lepší postup? Mám tam někam doplnit něco jako "Echo on", aby mně pak výpis těch souborů zůstal na obrazovce?

Moc jsem to do hloubky nestudoval, ale pochopil jsem to tak, že atribut "šifrovaný" neexistuje. Dá se sice rozpoznat, jestli je soubor šifrovaný či nikoliv, ale není to prostě obsaženo v jeho atributech (tak jako jsou pouze pro čtení, skrytý, systémový a pod.).

Ta ukázka stačí uložit do souboru s příponou vbs. Výpis na obrazovku je prostřednictvím Msgboxu - nevím, pro jaké to máš přesně použití, to by sis musel upravit podle vlastních požadavků.

OK tak sem překopíruju jeden z tech skriptů

' From the book "Windows XP Cookbook"
' ISBN: 0596007256

' ------ SCRIPT CONFIGURATION ------
strFilePath = "d:\\myfile.txt"
strComputer = "."
' ------ END CONFIGURATION ---------
set objWMI = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
set objFile = objWMI.Get("CIM_Datafile=""" & strFilePath & """")
WScript.Echo objFile.Name

WScript.Echo " 8.3 Name: " & objFile.EightDotThreeFileName
WScript.Echo " Drive: " & objFile.Drive
WScript.Echo " FileName: " & objFile.FileName
WScript.Echo " Extension: " & objFile.Extension
WScript.Echo " FileType: " & objFile.FileType
WScript.Echo " Path: " & objFile.Path
WScript.Echo " InUse Counter: " & objFile.InUseCount

WScript.Echo " Creation Date: " & objFile.CreationDate
WScript.Echo " Last Accessed: " & objFile.LastAccessed
WScript.Echo " Last Modified: " & objFile.LastModified

WScript.Echo " Archive: " & objFile.Archive
WScript.Echo " Compressed: " & objFile.Compressed
WScript.Echo " Encrypted: " & objFile.Encrypted
WScript.Echo " System: " & objFile.System
WScript.Echo " Writeable: " & objFile.Writeable
WScript.Echo " Hidden: " & objFile.Hidden

Myslím že je to docela výmluvný. strFilePath obsahuje cestu k souboru. Atributy se pak dají
zjištovat přes objekt objFile. Pokud je soubor šifrovaný, objFile.Encrypted je true, jinak false.

A jak se taková smyčka vytváří? Jestli ji umíš vytvořit, mohl bys mně ten skript napsat? Můžeme zůstat u toho příkladu výše s cílem najít a zobrazit všechny soubory na disku D: s atributem "šifrovaný" nebo "komprimovaný".

Než se pustíš do skriptování, měl bys projet aspoň základy:-) Skloubil jsem hostův kód s tím z odkazu a vyšlo

set objWMI = GetObject("winmgmts:\\.\root\cimv2")

Set fsoFolder = CreateObject("Scripting.FileSystemObject")
Set folder = fsoFolder.GetFolder("C:\")
Set files = folder.Files

for each objFile in files
strFilePath = "C:\\" & objFile.Name
set wmiobjFile = objWMI.Get("CIM_Datafile=""" & strFilePath & """")
msgbox objFile.Name & ", Compressed: " & wmiobjFile.Compressed & ", Encrypted: " & wmiobjFile.Encrypted
next

Basic jsem opustil už dávno tak je to taková slátanina... ale funguje:-)

Perfektní, Mitchi. Funguje na Win 2000 i na XP. Můžu jen ještě poprosit o radu, jak to udělat, aby to projelo i podsložky a ignorovalo soubory, které nejsou ani šifrované ani komprimované? Tak aby výsledek byl seznam jenom souborů šifrovaných či komprimovaných ve všech složkách i podsložkách na disku. Předem děkuju za tu spoustu času, kterou jsi tomu už věnoval.

v zásadě je potřeba napsat to rekurzivně (tj. udělat si funkci) a tou projíždět všechny adresáře, a znova vyhledat adresáře a ty předat jako parametry dané funkci (+ samozřejmě to tvé vyhledávání)

Napsal bych to, je to otázka max. 30 minut, ale v souč. době na to prostě nemám čas.

Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
Set fso = CreateObject("Scripting.FileSystemObject")

AnalyzeDir(fso.GetFolder(WScript.Arguments(0)))

Sub AnalyzeDir(dir)

  for each file in dir.Files

	Set wmiobjFile = objWMI.Get("CIM_Datafile=""" & Replace(file.Path,"\","\\") & """")
	If wmiobjFile.Compressed or wmiobjFile.Encrypted Then
	  str = file.Path & " "
	  If wmiobjFile.Compressed Then str = str & "C"
	  If wmiobjFile.Encrypted Then str = str & "E"
	  Wscript.Echo(str)
	End If
	
  next
  
  for each nextdir in dir.SubFolders
    AnalyzeDir(nextdir)
  Next

 
 End Sub

WScript.Echo()
WScript.Echo("Prohledávání bylo dokončeno")
WScript.StdIn.ReadLine

Ten Basic to je strašně ukecanej jazyk:-) Je to dělaný pro konzoli a přijímá jeden parametr a to je složka ve které to má začít. Když to uložíš jako skript.vbs a budeš chtít projet celý C tak to pusť..

cscript C:\script.vbs C:\

Skript zobrazí jen soubory které jsou buď komprimované nebo šifrované a za jejich názvem pak C pro komprimovaný soubor a E pro šifrovaný.

//EDIT: Dalo by se to možná řešit i SQL dotazem ale nějak se mi to nepodařilo zprovoznit.

Mitchi, smekám před tvými schopnostmi a jsem tvým (alespoň virtuálním) dlužníkem. Skript funguje na obou platformách bezchybně přesně tak, jak jsem potřeboval. Snad jen ještě jeden minidetail. Při testování skript narazil na složku dllcache, kde je velké množství komprimovaných souborů. Seznam na příkazovém řádku byl tak dlouhý, že na obrazovce zůstal jen jeho konec. Dá se v příkazovém řádku nějak "doskákat" dopředu na začátek toho seznamu?

Zpět do poradny Odpovědět na původní otázku Nahoru