pedrosojones Posted February 25, 2010 Share Posted February 25, 2010 Hi, How can I use the FileMove to move *.pst files but from all subdirectories to a specific location? Thank-you, Br, João Jones Link to comment Share on other sites More sharing options...
99ojo Posted February 25, 2010 Share Posted February 25, 2010 (edited) Hi, welcome to forum. expandcollapse popup;Start Folder $dir = "D:\" ;target Folder !! without \ !! $target = "D:\backup" $arfiles = _GetFilesFolder_Rekursiv($dir, "pst", 0) For $i = 1 To UBound ($arfiles) - 1 ;move to $target with directory structure If StringRight ($dir, 1) = "\" Then FileMove ($arfiles [$i], StringReplace ($arfiles [$i], StringLeft ($dir, StringLen ($dir) - 1), $target),8) Else FileMove ($arfiles [$i], StringReplace ($arfiles [$i], $dir, $target)) EndIf Next ;================================================================================================== ; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]]) ; Description: recursive listing of files and/or folders ; Parameter(s): $sPath Basicpath of listing ('.' -current path, '..' -parent path) ; $sExt Extension for file selection '*' or -1 for all (Default) ; $iDir -1 Files+Folder(Default), 0 only Files, 1 only Folder ; optional: $iRetType 0 for Array, 1 for String as Return ; optional: $sDelim Delimiter for string return ; 0 -@CRLF (Default) 1 -@CR 2 -@LF 3 -';' 4 -'|' ; Return Value(s): Array (Default) or string with found pathes of files and/or folder ; Array[0] includes count of found files/folder ; Author(s): BugFix (bugfix@autoit.de) ;================================================================================================== Func _GetFilesFolder_Rekursiv($sPath, $sExt='*', $iDir=-1, $iRetType=0, $sDelim='0') Global $oFSO = ObjCreate('Scripting.FileSystemObject') Global $strFiles = '' Switch $sDelim Case '1' $sDelim = @CR Case '2' $sDelim = @LF Case '3' $sDelim = ';' Case '4' $sDelim = '|' Case Else $sDelim = @CRLF EndSwitch If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0 If $sExt = -1 Then $sExt = '*' If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1 _ShowSubFolders($oFSO.GetFolder($sPath),$sExt,$iDir,$sDelim) If $iRetType = 0 Then Local $aOut $aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1) If $aOut[1] = '' Then ReDim $aOut[1] $aOut[0] = 0 EndIf Return $aOut Else Return StringTrimRight($strFiles, StringLen($sDelim)) EndIf EndFunc Func _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF) If Not IsDeclared("strFiles") Then Global $strFiles = '' If ($Dir = -1) Or ($Dir = 0) Then For $file In $Folder.Files If $Ext <> '*' Then If StringRight($file.Name, StringLen($Ext)) = $Ext Then _ $strFiles &= $file.Path & $Delim Else $strFiles &= $file.Path & $Delim EndIf Next EndIf For $Subfolder In $Folder.SubFolders If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim) Next EndFunc ;-)) Stefan @Edit: See post #5 Edited February 25, 2010 by 99ojo Link to comment Share on other sites More sharing options...
dani Posted February 25, 2010 Share Posted February 25, 2010 (edited) Or use this: $loc = @ScriptDir & "\" & "PSTfiles" MoveFiles(@ScriptDir, "pst", $loc) ; Scans @ScriptDir & subdirectories for .pst files Func MoveFiles($hDir, $ext, $location) FileChangeDir($hDir) $hSearch = FileFindFirstFile("*.*") $hFile = FileFindNextFile($hSearch) While Not @error If @extended Then ; $hFile is a directory MoveFiles($hDir & "\" & $hFile, $ext, $location) ; Scan the subdirectory for .pst files Else ; $hFile is a file If StringRegExp($hFile, "(?i)\." & $ext & "\z") Then FileMove($hFile, $location & "\" & $hFile, 8) ; Move $hFile to $location (create directory if needed -- flag 8) EndIf $hFile = FileFindNextFile($hSearch) WEnd FileClose($hSearch) EndFunc Edited February 25, 2010 by d4ni Link to comment Share on other sites More sharing options...
pedrosojones Posted February 25, 2010 Author Share Posted February 25, 2010 Thank-you very much everybody Link to comment Share on other sites More sharing options...
pedrosojones Posted February 25, 2010 Author Share Posted February 25, 2010 Or use this: $loc = @ScriptDir & "\" & "PSTfiles" MoveFiles(@ScriptDir, "pst", $loc) ; Scans @ScriptDir & subdirectories for .pst files Func MoveFiles($hDir, $ext, $location) FileChangeDir($hDir) $hSearch = FileFindFirstFile("*.*") $hFile = FileFindNextFile($hSearch) While Not @error If @extended Then ; $hFile is a directory MoveFiles($hDir & "\" & $hFile, $ext, $location) ; Scan the subdirectory for .pst files Else ; $hFile is a file If StringRegExp($hFile, "(?i)\." & $ext & "\z") Then FileMove($hFile, $location & "\" & $hFile, 8) ; Move $hFile to $location (create directory if needed -- flag 8) EndIf $hFile = FileFindNextFile($hSearch) WEnd FileClose($hSearch) EndFunc Thank-you d4ni, I have a small problem with it. I have various PST file under the D:\ drive Under--> D:\Data\outlook\Private.pst D:\Data\Private2.pst D:\Data\Test3.pst I modified the 2nd line of your script to: MoveFiles("D:\", "pst", $loc) ; Scans @ScriptDir & subdirectories for .pst files And the result is: He moved only the D:\Data\outlook\Private.pst and not the rest of the PST's Can you help me ? Thank-you in advance Link to comment Share on other sites More sharing options...
dani Posted February 25, 2010 Share Posted February 25, 2010 (edited) I will have a look at it, I was also able to reproduce it. For some reason FileMove returns 0 (failure) on the other 2 .pst files -- it does actually execute FileMove for all .pst files as expected. I'll edit this post soon. ~ edit Ok here you go. Problem was the @WorkingDir was changed when MoveFiles() was called recursively, but in the Else statement ; $hFile is a file, I had to change it back but forgot $loc = @ScriptDir & "\" & "PSTfiles" MoveFiles(@ScriptDir, "pst", $loc) ; Scans @ScriptDir & subdirectories for .pst files Func MoveFiles($hDir, $ext, $target) If Not StringRegExp($target, "\\\z") Then $target &= "\" FileChangeDir($hDir) $hSearch = FileFindFirstFile("*.*") $hFile = FileFindNextFile($hSearch) While Not @error If @extended Then ; $hFile is a directory MoveFiles($hDir & "\" & $hFile, $ext, $target) ; Scan the subdirectory for .pst files Else ; $hFile is a file FileChangeDir($hDir) If StringRegExp($hFile, "(?i)\." & $ext & "\z") Then FileMove($hFile, $target, 8+1) ; Move $hFile to $target (create directory if needed and overwrite existing files -- flag 8+1) EndIf $hFile = FileFindNextFile($hSearch) WEnd FileClose($hSearch) EndFunc Edited February 25, 2010 by d4ni Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now