Что нового

[Файловая система] Перебор каталогов

QuickMike

Новичок
Сообщения
8
Репутация
0
Необходимо перебрать в каталоге \Documents and Settings\ все существующие каталоги, для нахождения учетных записей и замене файлов на рабочем столе.

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

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
QuickMike
Попробуйте так:
Код:
#Include <File.au3>
#Include <Array.au3>

$sPath = @HomeDrive & "\Documents and Settings"
$aUsers = _FileListToArray($sPath, "*", 2)
_ArrayDisplay($aUsers)
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Код:
#include <file.au3>
#include <array.au3>
$path = 'c:\Documents and Settings'
$s = ''
_FolderLister($path)
$a = StringSplit(StringStripCR($s), @LF)
_ArrayDisplay($a)
Func _FolderLister($spath)
	$aFolders = _FileListToArray($spath, '*', 2)
	If Not IsArray($aFolders) Then return 0
	For $i = 1 to $aFolders[0]
		$s &= $aFolders[$i] & @CRLF
		_FolderLister($spath & '\' & $aFolders[$i])
	Next
EndFunc
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
QuickMike
Давно делал, может подойдёт

Код:
Exit ; пример не для запуска
$bykvadicka081=StringMid(GUICtrlRead ($bykvadicka80), 1,2)
$aFolderDAS = _FileListToArrayEx($bykvadicka081 & '\Documents and Settings', "", 2, 0)

$x1='-'
$x2='-'
$x3='-'
$x4='-'
$x5='-'

$z=1
For $i=2 To $aFolderDAS[0]
	$x=$i-$z
   $aNameUser=StringRegExp($aFolderDAS[$i], "(^.*)\\(.*)$", 3)
	If StringRegExp($aNameUser[1], "All Users|Default User|LocalService|NetworkService", 0)=0 and FileExists($bykvadicka081 & '\Documents and Settings\'&$aNameUser[1]&'\NTUSER.DAT') Then
	   Assign('x' & $x, $aNameUser[1])
	else
	   $z+=1
	EndIf
Next
GUICtrlSendMsg($username, 0x14B, 0, 0)
GUICtrlSetData($username,'текущий|'&$x1&'|'&$x2&'|'&$x3&'|'&$x4&'|'&$x5, 'текущий')


Здесь две проверки исключений, по файлу NTUSER.DAT и кроме папок "All Users|Default User|LocalService|NetworkService".
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
AZJIO
А у меня так работает:
Код:
#include <File.au3>
#include <Array.au3>

$sPath = @HomeDrive & "\Documents and Settings"
Dim $aUsers[1]
$aTemp = _FileListToArray($sPath, "*", 2)

For $i = 1 To UBound($aTemp) - 1
	If FileGetAttrib($sPath & "\" & $aTemp[$i]) = 'D' And $aTemp[$i] <> 'All Users' Then
		_ArrayAdd($aUsers, $aTemp[$i])
		$aUsers[0] += 1
	EndIf
Next
_ArrayDisplay($aUsers, "Папки юзеров")
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
Мне кажется так будет корректнее:

Код:
#include <Array.au3>

$aUsers = _SystemGetUserProfiles()
_ArrayDisplay($aUsers)

Func _SystemGetUserProfiles()
	Local $aUsers[100], $colItems, $objWMIService, $objItem, $sDocsAndSettingsPath = StringRegExpReplace(@UserProfileDir, "\\[^\\]*$", "\\")
	Local Const $wbemFlagReturnImmediately = 0x10, $wbemFlagForwardOnly = 0x20
	
	$objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
	$colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_UserAccount", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
	
	If Not IsObj($colItems) Then
		Return SetError(1, 1, 0)
	EndIf
	
	For $objItem In $colItems
		If FileExists($sDocsAndSettingsPath & $objItem.Name & "\NTUSER.DAT") Then
			$aUsers[0] += 1
			$aUsers[$aUsers[0]] = $sDocsAndSettingsPath & $objItem.Name
		EndIf
	Next
	
	ReDim $aUsers[$aUsers[0]+1]
	Return $aUsers
EndFunc
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
QuickMike
Операционная система ищет адрес папки с профилями под ключом:
Код:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
в параметре "ProfilesDirectory"...
Под этим же ключом перечислены все профили пользователей, в том числе и системных...
Адрес папки с профилем каждого пользователя хранится в параметре ""ProfileImagePath"...
Адреса системных папок текущего пользователя находятся под парой ключей:
Код:
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
К примеру, адрес рабочего стола хранится в параметре ""Desktop"...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
snoitaleR [?]
Под этим же ключом перечислены все профили пользователей, в том числе и системных
Отлично, тогда вот функция с использованием реестра:

Код:
#include <Array.au3>

$aUsers = _SystemGetUserProfiles(0)
_ArrayDisplay($aUsers)

Func _SystemGetUserProfiles($iRetSysProfiles = 0)
	Local $aUsers[100], $sKey, $iInstance, $sUserPath, $sRegPath = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"
	Local $iOpt_EES = Opt("ExpandEnvStrings", 1)
    
	While 1
		$iInstance += 1
		$sKey = RegEnumKey($sRegPath, $iInstance)
		
		If @error <> 0 Then
			ExitLoop
		EndIf
		
		$sUserPath = RegRead($sRegPath & "\" & $sKey, "ProfileImagePath")
		
		If (($iRetSysProfiles = 0 And Not StringInStr(FileGetAttrib($sUserPath), "S")) Or $iRetSysProfiles = 1) And FileExists($sUserPath & "\NTUSER.DAT") Then
            $aUsers[0] += 1
            $aUsers[$aUsers[0]] = $sUserPath
        EndIf
	WEnd
    
	Opt("ExpandEnvStrings", $iOpt_EES)
	
    ReDim $aUsers[$aUsers[0]+1]
    Return $aUsers
EndFunc
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
snoitaleR
Мне нужно было вытащить пути из другой системы, поэтому вариант с реестром только для текущей системы. Далее по скрипту временно подключался NTUSER.DAT к текущему реестру и извлекались пути из Shell Folders", "User Shell Folders".
 
Автор
Q

QuickMike

Новичок
Сообщения
8
Репутация
0
madmasles сказал(а):
QuickMike
Попробуйте так:
Код:
#Include <File.au3>
#Include <Array.au3>

$sPath = @HomeDrive & "\Documents and Settings"
$aUsers = _FileListToArray($sPath, "*", 2)
_ArrayDisplay($aUsers)
Спасибо, то что мне было нужно!
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
AZJIO
Мне кажется, без обращения к реестру локально или удаленно нельзя корректно определить расположение системных папок...
К примеру, у меня WINDOWS находится в папке C:\WORK, профили - в папке C:\USER, программы - в папке C:\WORK\PROGRAM...

Хотя есть еще вариант - поиск файлов NTUSER.DAT по всему диску...
 
Верх