Что нового

Перемещение файлов

SavickiyAV

Новичок
Сообщения
23
Репутация
0
Добрый день! Помогите пожалуйста!
есть папка с известным названием "DOC" в ней неопределенное количество папок что то в районе 10 штук и у каждой из этих папок есть своё дерево каталогов в нем нужно найти все файлы *.docx и переместить в корень папки следующей за DOC
то есть сейчас
doc\folder1\...\........\1.docx
...
doc\folderN\...\........\N.docx
должно стать
doc\folder1\1.docx
...
doc\folderN\N.docx

по возможности папки от folder1 до *.docx нужно удалить
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Выберите папку DOC
Код:
;~ AutoIt Version: 3.3.14.5
#include <WinAPIShPath.au3>
#include <File.au3>

Local $sRoot = FileSelectFolder("", @WorkingDir)
If @error Then Exit

Local $aFolders = _FileListToArray($sRoot, "*", $FLTA_FOLDERS, True)
If @error Then Exit MsgBox($MB_TOPMOST + $MB_ICONERROR, Default, "Папки не найдены.")

Local $aSubFolders, $aFiles
For $i = 1 To $aFolders[0]
    $aSubFolders = _FileListToArray($aFolders[$i], "*", $FLTA_FOLDERS, True)
    If @error Then ContinueLoop

    For $j = 1 To $aSubFolders[0]
        $aFiles = _FileListToArrayRec($aSubFolders[$j], "*.docx", $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_NOSORT, $FLTAR_FULLPATH)
        If Not @error Then
            For $k = 1 To $aFiles[0]
                FileMove($aFiles[$k], _WinAPI_PathYetAnotherMakeUniqueName($aFolders[$i] & "\" & _WinAPI_PathFindFileName($aFiles[$k])))
            Next
        EndIf
        If Not DirGetSize($aSubFolders[$j]) Then DirRemove($aSubFolders[$j], $DIR_REMOVE)
    Next
Next
MsgBox($MB_TOPMOST + $MB_ICONINFORMATION, Default, "Готово!")
ShellExecute($sRoot)
 
Автор
S

SavickiyAV

Новичок
Сообщения
23
Репутация
0
Выберите папку DOC
Код:
;~ AutoIt Version: 3.3.14.5
#include <WinAPIShPath.au3>
#include <File.au3>

Local $sRoot = FileSelectFolder("", @WorkingDir)
If @error Then Exit

Local $aFolders = _FileListToArray($sRoot, "*", $FLTA_FOLDERS, True)
If @error Then Exit MsgBox($MB_TOPMOST + $MB_ICONERROR, Default, "Папки не найдены.")

Local $aSubFolders, $aFiles
For $i = 1 To $aFolders[0]
    $aSubFolders = _FileListToArray($aFolders[$i], "*", $FLTA_FOLDERS, True)
    If @error Then ContinueLoop

    For $j = 1 To $aSubFolders[0]
        $aFiles = _FileListToArrayRec($aSubFolders[$j], "*.docx", $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_NOSORT, $FLTAR_FULLPATH)
        If Not @error Then
            For $k = 1 To $aFiles[0]
                FileMove($aFiles[$k], _WinAPI_PathYetAnotherMakeUniqueName($aFolders[$i] & "\" & _WinAPI_PathFindFileName($aFiles[$k])))
            Next
        EndIf
        If Not DirGetSize($aSubFolders[$j]) Then DirRemove($aSubFolders[$j], $DIR_REMOVE)
    Next
Next
MsgBox($MB_TOPMOST + $MB_ICONINFORMATION, Default, "Готово!")
ShellExecute($sRoot)
подскажите пожалуйста а как сделать что бы папка следующая за folder1 - folderN так де не удалялась ?
Сообщение автоматически объединено:

решил вопрос правкой 1 строчки на
Код:
FileMove($aFiles[$k], _WinAPI_PathYetAnotherMakeUniqueName($aSubFolders[$j] & "\" & _WinAPI_PathFindFileName($aFiles[$k])))

и добавление еще 1 цикла
Сообщение автоматически объединено:

и еще 1 вопрос по задаче. можно ли и как передать значение переменной $sRoot (путь к папке DOC типа C:\1\1\DOC) из PowerShell ?
предположительно скрипт au3 будет преобразован в ехе и будет запускаться из PowerShell и путь к папке DOC будет известен в PowerShell
 
Последнее редактирование:

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Вы можете добавить вариант с передачей пути как параметра командой строки
Код:
#include <WinAPIShPath.au3>
#include <File.au3>

Local $sRoot = $CMDLINE[0] ? $CMDLINE[1] : FileSelectFolder("", @WorkingDir)
If @error Then Exit
;~ ...
;~ ...
;~ ...
 
Последнее редактирование:
Верх