Что нового

Перемещение пользовательских папок на другой диск

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
ссылка конкретно не создается, пишет нет доступа или что-то в этом роде
Нужно точно понимать что нет доступа или что то другое.
В программировании не гадают, это точная наука )).

Но судя по утверждению что проходит через раз, видимо дело не в правах пользователя.
 
Автор
S

sas2242

Новичок
Сообщения
38
Репутация
0
Нужно точно понимать что нет доступа или что то другое.
В программировании не гадают, это точная наука )).

Но судя по утверждению что проходит через раз, видимо дело не в правах пользователя.
Поставил создание символьной ссылки для рабочего стола вверх списка и запустил без скрытия консольных окон.


Теперь тоже самое, только с закрытым окном в проводнике.


Скрипт который использовался в видео:
#NoTrayIcon
#RequireAdmin
#include <AutoItConstants.au3>
#include <WinAPIFiles.au3>
#Include <WinAPIShellEx.au3>

_WinAPI_Wow64EnableWow64FsRedirection(False)

Global $sDisk = 'D:'
Global $sRegKey1 = 'HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer'
Global $sRegKey2 = 'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer'
Global $sScriptDir = _ScriptDir() ; $sScriptDir далее можно использовать как замену @ScriptDir

Global $aDisks = DriveGetDrive($DT_FIXED)

If $aDisks[0] > 1 Then
    ;1 Это диск С как правило - системный, поэтому обходим его.
    For $i = 2 To $aDisks[0]
        If $aDisks[$i] = $sDisk Then
            _Main()
            Exit
        ElseIf MsgBox(36, 'Внимание', 'Перенести пользовательские папки на диск ' & StringUpper($aDisks[$i]) & '\?') = 6 Then
            $sDisk = $aDisks[$i]
            _Main()
            Exit
        Else
            ExitLoop
        EndIf
    Next
EndIf

    ;Копирование личных папок и файлов в (%UserProfile%).
    DirCopy($sScriptDir & '\USFOLDERS', @UserProfileDir, 1)

Func _Main()
    ;Перемещение папок: Загрузки, Мои видеозаписи, Мои документы, Мои изображения, Моя музыка, Рабочий стол и Сохраненные игры на другой диск.
    _XCopy(@UserProfileDir & '\Downloads', $sDisk & '\Downloads')
    _XCopy(@UserProfileDir & '\Music', $sDisk & '\Music')
    _XCopy(@UserProfileDir & '\Pictures', $sDisk & '\Pictures')
    _XCopy(@UserProfileDir & '\Saved Games', $sDisk & '\Saved Games')
    _XCopy(@UserProfileDir & '\Videos', $sDisk & '\Videos')

    _RegAdd($sRegKey1, 'Shell Folders', 'User Shell Folders', '{374DE290-123F-4565-9164-39C4925E467B}', $sDisk & '\Downloads')
    _RegAdd($sRegKey1, 'Shell Folders', 'User Shell Folders', 'My Music', $sDisk & '\Music')
    _RegAdd($sRegKey1, 'Shell Folders', 'User Shell Folders', 'My Pictures', $sDisk & '\Pictures')
    _RegAdd($sRegKey1, 'Shell Folders', 'User Shell Folders', '{4C5C32FF-BB9D-43B0-B5B4-2D72E54EAAA4}', $sDisk & '\Saved Games')
    _RegAdd($sRegKey1, 'Shell Folders', 'User Shell Folders', 'My Video', $sDisk & '\Videos')

    _RD(@UserProfileDir & '\Downloads')
    _RD(@UserProfileDir & '\Music')
    _RD(@UserProfileDir & '\Pictures')
    _RD(@UserProfileDir & '\Saved Games')
    _RD(@UserProfileDir & '\Videos')

    _XCopy(@UserProfileDir & '\Desktop', $sDisk & '\Desktop')
    _XCopy(@UserProfileDir & '\Documents', $sDisk & '\Documents')

    _RegAdd($sRegKey1, 'Shell Folders', 'User Shell Folders', 'Desktop', $sDisk & '\Desktop')
    _RegAdd($sRegKey1, 'Shell Folders', 'User Shell Folders', 'Personal', $sDisk & '\Documents')
    _RegAdd($sRegKey2, 'DocFolderPaths', '', @UserName, $sDisk & '\Documents')

    _RD(@UserProfileDir & '\Desktop')
    _RD(@UserProfileDir & '\Documents')

    ;Создание символьных ссылок в папке профиля (%UserProfile%) + Добавление атрибутов "Скрытый\Системный" для символьных ссылок.
    _MKLink(@UserProfileDir & '\Desktop', $sDisk & '\Desktop')
    _MKLink(@UserProfileDir & '\Downloads', $sDisk & '\Downloads')
    _MKLink(@UserProfileDir & '\Music', $sDisk & '\Music')
    _MKLink(@UserProfileDir & '\Pictures', $sDisk & '\Pictures')
    _MKLink(@UserProfileDir & '\Saved Games', $sDisk & '\Saved Games')
    _MKLink(@UserProfileDir & '\Videos', $sDisk & '\Videos')
    _MKLink(@UserProfileDir & '\Documents', $sDisk & '\Documents')

    ;Добавление атрибутов "Скрытый\Системный" для папки Рабочий стол.
    FileSetAttrib($sDisk & '\Desktop', '+SH')

    ;Копирование личных папок и файлов в ($sDisk).
    DirCopy($sScriptDir & '\USFOLDERS', $sDisk & '\', 1)
    
    ;Обновление проводника
    _WinAPI_ShellChangeNotify($SHCNE_ASSOCCHANGED, BitOR($SHCNF_IDLIST, $SHCNF_FLUSH))
    _WinAPI_ShellChangeNotify($SHCNE_ALLEVENTS, BitOR($SHCNF_IDLIST, $SHCNF_FLUSH))
EndFunc

Func _ScriptDir()
    Return StringRegExpReplace(@ScriptDir, '\\$', '')
EndFunc

Func _XCopy($sSrc, $sDst, $sParams = '/H /I /K /O /Q /R /S /Y')
    RunWait(@ComSpec & ' /c XCOPY "' & $sSrc & '" "' & $sDst & '" ' & $sParams & ' || MD "' & $sDst & '"', '', @SW_HIDE)
EndFunc

Func _RegAdd($sRegKey, $sKey1, $sKey2, $sValName, $sValue)
    Run(@ComSpec & ' /c REG ADD "' & $sRegKey & '\' & $sKey1 & '" /v "' & $sValName & '" /t REG_SZ /d "' & $sValue & '" /f', '', @SW_HIDE)

    If $sKey2 Then
        Run(@ComSpec & ' /c REG ADD "' & $sRegKey & '\' & $sKey2 & '" /v "' & $sValName & '" /t REG_EXPAND_SZ /d "' & $sValue & '" /f', '', @SW_HIDE)
    EndIf
EndFunc

Func _RD($sPath)
    RunWait(@ComSpec & ' /c RD /S /Q "' & $sPath & '"', '', @SW_HIDE)
EndFunc

Func _MKLink($sSymLink, $sTarget)
    RunWait(@ComSpec & ' /k MKLINK /J "' & $sSymLink & '" "' & $sTarget & '" && ATTRIB +S +H "' & $sSymLink & '" /L')
EndFunc
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
тоже самое, только с закрытым окном в проводнике.
Не должно быть связи. Но если так уж надо, то закрыть окна проводника можно так:

Код:
$aExplorer = WinList('[CLASS:CabinetWClass]')

For $i = 1 To UBound($aExplorer) - 1
    WinClose($aExplorer[$i][1])
Next
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Как вариант ещё можно перед каждым вызовом MKLink закрывать окна проводника:

Код:
Func _MKLink($sSymLink, $sTarget)
    _Explorer_Close()
    RunWait(@ComSpec & ' /c MKLINK /J "' & $sSymLink & '" "' & $sTarget & '" && ATTRIB +H +S "' & $sSymLink & '" /L', '', @SW_HIDE)
EndFunc

Func _Explorer_Close()
    Local $aExplorer = WinList('[CLASS:CabinetWClass]')
    
    For $i = 1 To UBound($aExplorer) - 1
        WinClose($aExplorer[$i][1])
    Next
EndFunc
 
Автор
S

sas2242

Новичок
Сообщения
38
Репутация
0
Как вариант ещё можно перед каждым вызовом MKLink закрывать окна проводника:

Код:
Func _MKLink($sSymLink, $sTarget)
    _Explorer_Close()
    RunWait(@ComSpec & ' /c MKLINK /J "' & $sSymLink & '" "' & $sTarget & '" && ATTRIB +H +S "' & $sSymLink & '" /L', '', @SW_HIDE)
EndFunc

Func _Explorer_Close()
    Local $aExplorer = WinList('[CLASS:CabinetWClass]')
 
    For $i = 1 To UBound($aExplorer) - 1
        WinClose($aExplorer[$i][1])
    Next
EndFunc
Этот вариант не работает, видимо из-за того, что окна закрываются и сразу же выполняется создание ссылки, а вот если закрытие проводника поставить куда-нибудь в начале скрипта, то работает в 99.999999% как надо. Спасибо. Правда минус небольшой есть, это то, что проводник можно опять открыть пока скрипт выполняет работу и тогда... ;) Если бы его можно было заморозить, с уведомление, что то вроде "Подождите выполняется работа скрипта". А в крайнем случае его можно на время работы скрипта вообще закрывать taskill /f /im explorer.exe а после окончания работы start explorer.exe
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
заморозить, с уведомление, что то вроде "Подождите выполняется работа скрипта"
Как то так:
Код:
#RequireAdmin

;Это в начало скрипта
$aExplorer = WinList('[CLASS:CabinetWClass]')

For $i = 1 To UBound($aExplorer) - 1
    WinClose($aExplorer[$i][1])
Next

BlockInput(1)
SplashTextOn('Выполнение...', 'Подождите выполняется работа скрипта...')

;Тут тело скрипта...


;Это в конце
BlockInput(0)
SplashOff()
 
Автор
S

sas2242

Новичок
Сообщения
38
Репутация
0
Как то так:
Код:
#RequireAdmin

;Это в начало скрипта
$aExplorer = WinList('[CLASS:CabinetWClass]')

For $i = 1 To UBound($aExplorer) - 1
    WinClose($aExplorer[$i][1])
Next

BlockInput(1)
SplashTextOn('Выполнение...', 'Подождите выполняется работа скрипта...')

;Тут тело скрипта...


;Это в конце
BlockInput(0)
SplashOff()
дааа, работает!!! огромное при огромное СПАСИБО. Только окно с уведомлением на пол экрана и с одной строкой вверху )) можно его сделать таким же по размерам как и прошлое о уведомлении о переносе на другой диск? А так все отлично, еще миллион раз спасибо.

Пока скрипт выглядит вот-так (куда правильнее вставить код из предыдущего сообщения и нужна ли функция обновления проводника с учетом кода выше?):
#NoTrayIcon
#RequireAdmin
#include <AutoItConstants.au3>
#include <WinAPIFiles.au3>
#Include <WinAPIShellEx.au3>

_WinAPI_Wow64EnableWow64FsRedirection(False)

Global $sDisk = 'D:'
Global $sRegKey1 = 'HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer'
Global $sRegKey2 = 'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer'
Global $sScriptDir = _ScriptDir() ; $sScriptDir далее можно использовать как замену @ScriptDir

Global $aDisks = DriveGetDrive($DT_FIXED)

If $aDisks[0] > 1 Then
    ;1 Это диск С как правило - системный, поэтому обходим его.
    For $i = 2 To $aDisks[0]
        If $aDisks[$i] = $sDisk Then
            _Main()
            Exit
        ElseIf MsgBox(36, 'Внимание', 'Перенести пользовательские папки на диск ' & StringUpper($aDisks[$i]) & '\?') = 6 Then
            $sDisk = $aDisks[$i]
            _Main()
            Exit
        Else
            ExitLoop
        EndIf
    Next
EndIf

    ;Копирование личных папок и файлов в (%UserProfile%).
    DirCopy($sScriptDir & '\USFOLDERS', @UserProfileDir, 1)

Func _Main()
    ;Перемещение папок: Загрузки, Мои видеозаписи, Мои документы, Мои изображения, Моя музыка, Рабочий стол и Сохраненные игры на другой диск.
    _XCopy(@UserProfileDir & '\Downloads', $sDisk & '\Downloads')
    _XCopy(@UserProfileDir & '\Music', $sDisk & '\Music')
    _XCopy(@UserProfileDir & '\Pictures', $sDisk & '\Pictures')
    _XCopy(@UserProfileDir & '\Saved Games', $sDisk & '\Saved Games')
    _XCopy(@UserProfileDir & '\Videos', $sDisk & '\Videos')

    _RegAdd($sRegKey1, 'Shell Folders', 'User Shell Folders', '{374DE290-123F-4565-9164-39C4925E467B}', $sDisk & '\Downloads')
    _RegAdd($sRegKey1, 'Shell Folders', 'User Shell Folders', 'My Music', $sDisk & '\Music')
    _RegAdd($sRegKey1, 'Shell Folders', 'User Shell Folders', 'My Pictures', $sDisk & '\Pictures')
    _RegAdd($sRegKey1, 'Shell Folders', 'User Shell Folders', '{4C5C32FF-BB9D-43B0-B5B4-2D72E54EAAA4}', $sDisk & '\Saved Games')
    _RegAdd($sRegKey1, 'Shell Folders', 'User Shell Folders', 'My Video', $sDisk & '\Videos')

    _RD(@UserProfileDir & '\Downloads')
    _RD(@UserProfileDir & '\Music')
    _RD(@UserProfileDir & '\Pictures')
    _RD(@UserProfileDir & '\Saved Games')
    _RD(@UserProfileDir & '\Videos')

    _XCopy(@UserProfileDir & '\Desktop', $sDisk & '\Desktop')
    _XCopy(@UserProfileDir & '\Documents', $sDisk & '\Documents')

    _RegAdd($sRegKey1, 'Shell Folders', 'User Shell Folders', 'Desktop', $sDisk & '\Desktop')
    _RegAdd($sRegKey1, 'Shell Folders', 'User Shell Folders', 'Personal', $sDisk & '\Documents')
    _RegAdd($sRegKey2, 'DocFolderPaths', '', @UserName, $sDisk & '\Documents')

    _RD(@UserProfileDir & '\Desktop')
    _RD(@UserProfileDir & '\Documents')

    ;Создание символьных ссылок в папке профиля (%UserProfile%) + Добавление атрибутов "Скрытый\Системный" для символьных ссылок.
    _MKLink(@UserProfileDir & '\Downloads', $sDisk & '\Downloads')
    _MKLink(@UserProfileDir & '\Music', $sDisk & '\Music')
    _MKLink(@UserProfileDir & '\Pictures', $sDisk & '\Pictures')
    _MKLink(@UserProfileDir & '\Saved Games', $sDisk & '\Saved Games')
    _MKLink(@UserProfileDir & '\Videos', $sDisk & '\Videos')
    _MKLink(@UserProfileDir & '\Desktop', $sDisk & '\Desktop')
    _MKLink(@UserProfileDir & '\Documents', $sDisk & '\Documents')

    ;Добавление атрибутов "Скрытый\Системный" для папки Рабочий стол.
    FileSetAttrib($sDisk & '\Desktop', '+SH')

    ;Копирование личных папок и файлов в ($sDisk).
    DirCopy($sScriptDir & '\USFOLDERS', $sDisk & '\', 1)
   
    ;Обновление проводника
    _WinAPI_ShellChangeNotify($SHCNE_ASSOCCHANGED, BitOR($SHCNF_IDLIST, $SHCNF_FLUSH))
    _WinAPI_ShellChangeNotify($SHCNE_ALLEVENTS, BitOR($SHCNF_IDLIST, $SHCNF_FLUSH))
EndFunc

Func _ScriptDir()
    Return StringRegExpReplace(@ScriptDir, '\\$', '')
EndFunc

Func _XCopy($sSrc, $sDst, $sParams = '/H /I /K /O /Q /R /S /Y')
    RunWait(@ComSpec & ' /c XCOPY "' & $sSrc & '" "' & $sDst & '" ' & $sParams & ' || MD "' & $sDst & '"', '', @SW_HIDE)
EndFunc

Func _RegAdd($sRegKey, $sKey1, $sKey2, $sValName, $sValue)
    Run(@ComSpec & ' /c REG ADD "' & $sRegKey & '\' & $sKey1 & '" /v "' & $sValName & '" /t REG_SZ /d "' & $sValue & '" /f', '', @SW_HIDE)

    If $sKey2 Then
        Run(@ComSpec & ' /c REG ADD "' & $sRegKey & '\' & $sKey2 & '" /v "' & $sValName & '" /t REG_EXPAND_SZ /d "' & $sValue & '" /f', '', @SW_HIDE)
    EndIf
EndFunc

Func _RD($sPath)
    RunWait(@ComSpec & ' /c RD /S /Q "' & $sPath & '"', '', @SW_HIDE)
EndFunc

Func _MKLink($sSymLink, $sTarget)
    RunWait(@ComSpec & ' /c MKLINK /J "' & $sSymLink & '" "' & $sTarget & '" && ATTRIB +S +H "' & $sSymLink & '" /L', '', @SW_HIDE)
EndFunc
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
можно его сделать таким же по размерам как и прошлое о уведомлении о переносе на другой диск?
Я тебе настоятельно рекомендую пользоваться кнопкой F1 когда курсор на нужной функции, там есть вся информация как ей пользоваться:

Код:
#NoTrayIcon
#RequireAdmin
#include <AutoItConstants.au3>
#include <WinAPIFiles.au3>
#Include <WinAPIShellEx.au3>

_WinAPI_Wow64EnableWow64FsRedirection(False)

Global $sDisk = 'D:'
Global $sRegKey1 = 'HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer'
Global $sRegKey2 = 'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer'
Global $sScriptDir = _ScriptDir() ; $sScriptDir далее можно использовать как замену @ScriptDir

Global $aDisks = DriveGetDrive($DT_FIXED)

If $aDisks[0] > 1 Then
    ;1 Это диск С как правило - системный, поэтому обходим его.
    For $i = 2 To $aDisks[0]
        If $aDisks[$i] = $sDisk Then
            _Main()
            Exit
        ElseIf MsgBox(36, 'Внимание', 'Перенести пользовательские папки на диск ' & StringUpper($aDisks[$i]) & '\?') = 6 Then
            $sDisk = $aDisks[$i]
            _Main()
            Exit
        Else
            ExitLoop
        EndIf
    Next
EndIf

;Копирование личных папок и файлов в (C:\Users\mrgeo).
DirCopy($sScriptDir & '\USFOLDERS', @UserProfileDir, 1)

Func _Main()
    Local $aExplorer = WinList('[CLASS:CabinetWClass]')
    
    For $i = 1 To UBound($aExplorer) - 1
        WinClose($aExplorer[$i][1])
    Next
    
    BlockInput(1)
    SplashTextOn('Выполнение...', 'Подождите выполняется работа скрипта...', 250, 100, -1, -1, $DLG_TEXTVCENTER, 'Arial', 9)
    
    ;Перемещение папок: Загрузки, Мои видеозаписи, Мои документы, Мои изображения, Моя музыка, Рабочий стол и Сохраненные игры на другой диск.
    _XCopy(@UserProfileDir & '\Downloads', $sDisk & '\Downloads')
    _XCopy(@UserProfileDir & '\Music', $sDisk & '\Music')
    _XCopy(@UserProfileDir & '\Pictures', $sDisk & '\Pictures')
    _XCopy(@UserProfileDir & '\Saved Games', $sDisk & '\Saved Games')
    _XCopy(@UserProfileDir & '\Videos', $sDisk & '\Videos')

    _RegAdd($sRegKey1, 'Shell Folders', 'User Shell Folders', '{374DE290-123F-4565-9164-39C4925E467B}', $sDisk & '\Downloads')
    _RegAdd($sRegKey1, 'Shell Folders', 'User Shell Folders', 'My Music', $sDisk & '\Music')
    _RegAdd($sRegKey1, 'Shell Folders', 'User Shell Folders', 'My Pictures', $sDisk & '\Pictures')
    _RegAdd($sRegKey1, 'Shell Folders', 'User Shell Folders', '{4C5C32FF-BB9D-43B0-B5B4-2D72E54EAAA4}', $sDisk & '\Saved Games')
    _RegAdd($sRegKey1, 'Shell Folders', 'User Shell Folders', 'My Video', $sDisk & '\Videos')

    _RD(@UserProfileDir & '\Downloads')
    _RD(@UserProfileDir & '\Music')
    _RD(@UserProfileDir & '\Pictures')
    _RD(@UserProfileDir & '\Saved Games')
    _RD(@UserProfileDir & '\Videos')

    _XCopy(@UserProfileDir & '\Desktop', $sDisk & '\Desktop')
    _XCopy(@UserProfileDir & '\Documents', $sDisk & '\Documents')

    _RegAdd($sRegKey1, 'Shell Folders', 'User Shell Folders', 'Desktop', $sDisk & '\Desktop')
    _RegAdd($sRegKey1, 'Shell Folders', 'User Shell Folders', 'Personal', $sDisk & '\Documents')
    _RegAdd($sRegKey2, 'DocFolderPaths', '', @UserName, $sDisk & '\Documents')

    _RD(@UserProfileDir & '\Desktop')
    _RD(@UserProfileDir & '\Documents')

    ;Создание символьных ссылок в папке профиля (C:\Users\mrgeo) + Добавление атрибутов "Скрытый\Системный" для символьных ссылок.
    _MKLink(@UserProfileDir & '\Downloads', $sDisk & '\Downloads')
    _MKLink(@UserProfileDir & '\Music', $sDisk & '\Music')
    _MKLink(@UserProfileDir & '\Pictures', $sDisk & '\Pictures')
    _MKLink(@UserProfileDir & '\Saved Games', $sDisk & '\Saved Games')
    _MKLink(@UserProfileDir & '\Videos', $sDisk & '\Videos')
    _MKLink(@UserProfileDir & '\Desktop', $sDisk & '\Desktop')
    _MKLink(@UserProfileDir & '\Documents', $sDisk & '\Documents')

    ;Добавление атрибутов "Скрытый\Системный" для папки Рабочий стол.
    FileSetAttrib($sDisk & '\Desktop', '+SH')

    ;Копирование личных папок и файлов в ($sDisk).
    DirCopy($sScriptDir & '\USFOLDERS', $sDisk & '\', 1)
   
    ;Обновление проводника
    _WinAPI_ShellChangeNotify($SHCNE_ASSOCCHANGED, BitOR($SHCNF_IDLIST, $SHCNF_FLUSH))
    _WinAPI_ShellChangeNotify($SHCNE_ALLEVENTS, BitOR($SHCNF_IDLIST, $SHCNF_FLUSH))
    
    BlockInput(0)
    SplashOff()
EndFunc

Func _ScriptDir()
    Return StringRegExpReplace(@ScriptDir, '\\$', '')
EndFunc

Func _XCopy($sSrc, $sDst, $sParams = '/H /I /K /O /Q /R /S /Y')
    RunWait(@ComSpec & ' /c XCOPY "' & $sSrc & '" "' & $sDst & '" ' & $sParams & ' || MD "' & $sDst & '"', '', @SW_HIDE)
EndFunc

Func _RegAdd($sRegKey, $sKey1, $sKey2, $sValName, $sValue)
    RunWait(@ComSpec & ' /c REG ADD "' & $sRegKey & '\' & $sKey1 & '" /v "' & $sValName & '" /t REG_SZ /d "' & $sValue & '" /f', '', @SW_HIDE)

    If $sKey2 Then
        RunWait(@ComSpec & ' /c REG ADD "' & $sRegKey & '\' & $sKey2 & '" /v "' & $sValName & '" /t REG_EXPAND_SZ /d "' & $sValue & '" /f', '', @SW_HIDE)
    EndIf
EndFunc

Func _RD($sPath)
    RunWait(@ComSpec & ' /c RD /S /Q "' & $sPath & '"', '', @SW_HIDE)
EndFunc

Func _MKLink($sSymLink, $sTarget)
    RunWait(@ComSpec & ' /c MKLINK /J "' & $sSymLink & '" "' & $sTarget & '" && ATTRIB +S +H "' & $sSymLink & '" /L', '', @SW_HIDE)
EndFunc
 
Автор
S

sas2242

Новичок
Сообщения
38
Репутация
0
CreatoR, спасибо вам еще много раз за помощь, все работает как и хотел. Дальше буду углубляться в обучение самостоятельно. Единственное, и это последняя просьба, первое: Как заменить цвет текста и допустим сделать его жирным? например здесь MsgBox(36, 'Внимание', 'Перенести папки пользователя ' & @UserName & ' на диск ' & StringUpper($aDisks[$i]) & '\?') нужно сделать ' & @UserName & ' полужирным и допустим другим цветом. И второй вопрос, где можно почитать об изменение окон GUI? Ну, чтобы там менять стиль окна и так далее (добавлять свои рющечки, плюшечки и т.д.) Заранее еще раз огромное спасибо, здоровья вам и вашим близким, а так же удачи во всех ваших делах.
 
Автор
S

sas2242

Новичок
Сообщения
38
Репутация
0
CreatoR, как оказалось, заморозка проводника работает только на виртуальной машине, на живом компьютере она не работает, или работает не понятно по каким критериям, окна в проводнике все равно спокойно открываются и закрываются. ((( Хотя на моем компьютере работает, замораживается даже курсор мыши перестает двигаться. странно...
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
заморозка проводника
Это не заморозка проводника, это отключение ввода пользователя.

окна в проводнике все равно спокойно открываются и закрываются
Кем? Ручной ввод (как мышки так и клавиатуры) должен быть заблокирован на время выполнения функции _Main, если конечно в начале скрипта нет #RequireAdmin.
 
Автор
S

sas2242

Новичок
Сообщения
38
Репутация
0
CreatoR, решил немного отклонится от темы и задать пару вопросов. Как всегда надеюсь на вашу помощь. (( Первый: в данном скрипте, есть код DirCopy($sScriptDir & '\USFOLDERS', @UserProfileDir, 1) так вот я хотел узнать, а можно как-то содержимое папки "USFOLDERS" засунуть в скомпилированный скрипт? Чтобы папка USFOLDERS была в самом .exe. И есть ли возможность потом как-то декомпилировать этот скрипт если я захочу допустим обновить какие-то файлы в этой папке и скомпилировать его по новому? Второй вопрос: в cmd есть такая команда Ver|Find так вот нужно сделать, чтобы если Ver|Find "6.1" && то выполняется допустим Func _Win7() Как это можно прописать в скрипте Ver|Find "6.1" && Func _Win7() ?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Автор
S

sas2242

Новичок
Сообщения
38
Репутация
0
Для каждого вопроса создай тему (желательно предварительно поискать по форуму, возможно уже есть ответы на все твои вопросы).
Эта тема исчерпана.
понимаю )) наверное код в одну строку для вас = одна тема. (( Создам конечно...
Сообщение автоматически объединено:

CreatoR, хотел заменить в этом скрипте код отключения ввода пользователя на простое ProcessClose("explorer.exe") и соответственно после выполнения дальнейших действий Run("explorer.exe"), но почему-то ProcessClose("explorer.exe") не закрывает проводник а просто его перегружает, не подскажете как правильно заменить код отключения ввода пользователя на простое закрытие проводника и в дальнейшем его запуск? P.S.
 
Последнее редактирование:

IMStrelcov

CTPEJIbLLOB
Сообщения
259
Репутация
66
И есть ли возможность потом как-то декомпилировать этот скрипт если я захочу допустим обновить какие-то файлы в этой папке и скомпилировать его по новому?
Можно. Например при запуске ищешь определенный ключ в команде запуска скрипта и при его обнаружении все нужные файлы распаковываешь в нужную папку.
Код:
If StringInStr($CmdLineRaw, 'extract') Then
   FileInstall('file.au3', @TempDir& '\file.au3', 1)
   DirCreate(@TempDir& '\dir')
   FileInstall('file.txt', @TempDir& '\dir\file.txt', 1)
EndIf

или Ресурсы
 
Последнее редактирование:
Автор
S

sas2242

Новичок
Сообщения
38
Репутация
0
Можно. Например при запуске ищешь определенный ключ в команде запуска скрипта и при его обнаружении все нужные файлы распаковываешь в нужную папку.
Код:
If StringInStr($CmdLineRaw, 'extract') Then
   FileInstall('file.au3', @TempDir& '\file.au3', 1)
   DirCreate(@TempDir& '\dir')
   FileInstall('file.txt', @TempDir& '\dir\file.txt', 1)
EndIf

или Ресурсы
Спасибо большое за помощь, но для человека начинающего изучение языка, это сложновато, хотя я примерно и понял суть. Вот смотрите, допустим есть две папки 123 и 456 с различного типа содержимым (это те папки, содержимое которого может понадобится в дальнейшем обновить/заменить), при выполнении скрипта, содержимое этих папок будет копироваться в заданные пути. Первое - как эти папки(с их содержимым) для начала скомпилировать в сам .exe, чтобы они находились внутри исполняемого файла? Ну и второе - как при необходимости использовать тот код что вы написали выше, для изменения содержимого этих папок? Хорошо бы пример, хотя бы по типу папок 123 и 456.
 

IMStrelcov

CTPEJIbLLOB
Сообщения
259
Репутация
66
Спасибо большое за помощь, но для человека начинающего изучение языка, это сложновато, хотя я примерно и понял суть. Вот смотрите, допустим есть две папки 123 и 456 с различного типа содержимым (это те папки, содержимое которого может понадобится в дальнейшем обновить/заменить), при выполнении скрипта, содержимое этих папок будет копироваться в заданные пути. Первое - как эти папки(с их содержимым) для начала скомпилировать в сам .exe, чтобы они находились внутри исполняемого файла? Ну и второе - как при необходимости использовать тот код что вы написали выше, для изменения содержимого этих папок? Хорошо бы пример, хотя бы по типу папок 123 и 456.
Код:
;это самый простой способ с использованием функций AUTOIT-а
;помещаешь это в начале своего скрипта
;при запуске EXE с параметром extract файлы распакуются/извлекутся
;extract можешь заменить на другое слово в переменной ниже
$sEtrStr = 'extract'

If StringInStr($CmdLineRaw, $sEtrStr) Then
   ;создаем папку
   DirCreate(@ScriptDir& '\TestAu3\123')
   ;распаковываем файл, AUTOIT его сам упаковывает, читай справку
   ;первый параметр где находится файл который нужно добавить в EXE, путь не должен содержать переменных, читай справку
   ;второй куда его распаковать, можно использовать переменные, можно указать только папку без имени файла
   ;третий 1-перезаписать, 0-не перезаписывать
   FileInstall('123\file1.au3', @ScriptDir& '\TestAu3\123\file1.au3', 1)
   ;и так далее
   DirCreate(@ScriptDir& '\TestAu3\456')
   FileInstall('456\file1.txt', @ScriptDir& '\TestAu3\456\file1.txt', 1)
   FileInstall('456\file2.txt', @ScriptDir& '\TestAu3\456\file2.txt', 1)
   MsgBox(0, '', 'Файлы распакованы.')
EndIf
 
Автор
S

sas2242

Новичок
Сообщения
38
Репутация
0
Если я правильно понял, то это создается папка в которую будет распакован сам .exe при запуске

Здесь добавляется файл file1.au3 в .exe а распаковываться он будет по пути @ScriptDir& '\TestAu3\123'
FileInstall('123\file1.au3', @ScriptDir& '\TestAu3\123\file1.au3', 1)
Дело в том, что мне нужно добавить не файл file1.au3 в .exe а саму папку 123 с ее содержимым. Допустим в папке 123 лежит еще одна пустая папка MyProg и все. А в дальнейшем допустим мне понадобится удалить эту папку MyProg и вместо нее добавить к примеру папку 777, тогда как быть?

как пример можно взять этот скрипт, в нем содержимое папки USFOLDERS будет копироваться по заданному пути, вот собственно эту папку USFOLDERS с ее содержимым мне и нужно добавить в скомпилированный .exe а при надобности, отредактировать содержимое этой папки, допустим что-то удалить а что-то добавить, и по новому скомпилировать .exe с учетом изменений .

AutoIt код:
#NoTrayIcon
#RequireAdmin
#include <AutoItConstants.au3>
#include <WinAPIFiles.au3>
#Include <WinAPIShellEx.au3>

_WinAPI_Wow64EnableWow64FsRedirection(False)

Global $sDisk = 'D:'
Global $sRegKey1 = 'HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer'
Global $sRegKey2 = 'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer'
Global $sScriptDir = _ScriptDir() ; $sScriptDir далее можно использовать как замену @ScriptDir

Global $aDisks = DriveGetDrive($DT_FIXED)

If $aDisks[0] > 1 Then
    ;1 Это диск С как правило - системный, поэтому обходим его.
    For $i = 2 To $aDisks[0]
        If $aDisks[$i] = $sDisk Then
            _Main()
            Exit
        ElseIf MsgBox(36, 'Внимание', 'Перенести пользовательские папки на диск ' & StringUpper($aDisks[$i]) & '\?') = 6 Then
            $sDisk = $aDisks[$i]
            _Main()
            Exit
        Else
            ExitLoop
        EndIf
    Next
EndIf

;Копирование личных папок и файлов
DirCopy($sScriptDir & '\USFOLDERS', @UserProfileDir, 1)

Func _Main()
    Local $aExplorer = WinList('[CLASS:CabinetWClass]')
  
    For $i = 1 To UBound($aExplorer) - 1
        WinClose($aExplorer[$i][1])
    Next
  
    BlockInput(1)
    SplashTextOn('Выполнение...', 'Подождите выполняется работа скрипта...', 250, 100, -1, -1, $DLG_TEXTVCENTER, 'Arial', 9)
  
    ;Перемещение папок: Загрузки, Мои видеозаписи, Мои документы, Мои изображения, Моя музыка, Рабочий стол и Сохраненные игры на другой диск.
    _XCopy(@UserProfileDir & '\Downloads', $sDisk & '\Downloads')
    _XCopy(@UserProfileDir & '\Music', $sDisk & '\Music')
    _XCopy(@UserProfileDir & '\Pictures', $sDisk & '\Pictures')
    _XCopy(@UserProfileDir & '\Saved Games', $sDisk & '\Saved Games')
    _XCopy(@UserProfileDir & '\Videos', $sDisk & '\Videos')

    _RegAdd($sRegKey1, 'Shell Folders', 'User Shell Folders', '{374DE290-123F-4565-9164-39C4925E467B}', $sDisk & '\Downloads')
    _RegAdd($sRegKey1, 'Shell Folders', 'User Shell Folders', 'My Music', $sDisk & '\Music')
    _RegAdd($sRegKey1, 'Shell Folders', 'User Shell Folders', 'My Pictures', $sDisk & '\Pictures')
    _RegAdd($sRegKey1, 'Shell Folders', 'User Shell Folders', '{4C5C32FF-BB9D-43B0-B5B4-2D72E54EAAA4}', $sDisk & '\Saved Games')
    _RegAdd($sRegKey1, 'Shell Folders', 'User Shell Folders', 'My Video', $sDisk & '\Videos')

    _RD(@UserProfileDir & '\Downloads')
    _RD(@UserProfileDir & '\Music')
    _RD(@UserProfileDir & '\Pictures')
    _RD(@UserProfileDir & '\Saved Games')
    _RD(@UserProfileDir & '\Videos')

    _XCopy(@UserProfileDir & '\Desktop', $sDisk & '\Desktop')
    _XCopy(@UserProfileDir & '\Documents', $sDisk & '\Documents')

    _RegAdd($sRegKey1, 'Shell Folders', 'User Shell Folders', 'Desktop', $sDisk & '\Desktop')
    _RegAdd($sRegKey1, 'Shell Folders', 'User Shell Folders', 'Personal', $sDisk & '\Documents')
    _RegAdd($sRegKey2, 'DocFolderPaths', '', @UserName, $sDisk & '\Documents')

    _RD(@UserProfileDir & '\Desktop')
    _RD(@UserProfileDir & '\Documents')

    ;Создание символьных ссылок в папке профиля + Добавление атрибутов "Скрытый\Системный" для символьных ссылок.
    _MKLink(@UserProfileDir & '\Downloads', $sDisk & '\Downloads')
    _MKLink(@UserProfileDir & '\Music', $sDisk & '\Music')
    _MKLink(@UserProfileDir & '\Pictures', $sDisk & '\Pictures')
    _MKLink(@UserProfileDir & '\Saved Games', $sDisk & '\Saved Games')
    _MKLink(@UserProfileDir & '\Videos', $sDisk & '\Videos')
    _MKLink(@UserProfileDir & '\Desktop', $sDisk & '\Desktop')
    _MKLink(@UserProfileDir & '\Documents', $sDisk & '\Documents')

    ;Добавление атрибутов "Скрытый\Системный" для папки Рабочий стол.
    FileSetAttrib($sDisk & '\Desktop', '+SH')

    ;Копирование личных папок и файлов в ($sDisk).
    DirCopy($sScriptDir & '\USFOLDERS', $sDisk & '\', 1)

    ;Обновление проводника
    _WinAPI_ShellChangeNotify($SHCNE_ASSOCCHANGED, BitOR($SHCNF_IDLIST, $SHCNF_FLUSH))
    _WinAPI_ShellChangeNotify($SHCNE_ALLEVENTS, BitOR($SHCNF_IDLIST, $SHCNF_FLUSH))
  
    BlockInput(0)
    SplashOff()
EndFunc

Func _ScriptDir()
    Return StringRegExpReplace(@ScriptDir, '\\$', '')
EndFunc

Func _XCopy($sSrc, $sDst, $sParams = '/H /I /K /O /Q /R /S /Y')
    RunWait(@ComSpec & ' /c XCOPY "' & $sSrc & '" "' & $sDst & '" ' & $sParams & ' || MD "' & $sDst & '"', '', @SW_HIDE)
EndFunc

Func _RegAdd($sRegKey, $sKey1, $sKey2, $sValName, $sValue)
    RunWait(@ComSpec & ' /c REG ADD "' & $sRegKey & '\' & $sKey1 & '" /v "' & $sValName & '" /t REG_SZ /d "' & $sValue & '" /f', '', @SW_HIDE)

    If $sKey2 Then
        RunWait(@ComSpec & ' /c REG ADD "' & $sRegKey & '\' & $sKey2 & '" /v "' & $sValName & '" /t REG_EXPAND_SZ /d "' & $sValue & '" /f', '', @SW_HIDE)
    EndIf
EndFunc

Func _RD($sPath)
    RunWait(@ComSpec & ' /c RD /S /Q "' & $sPath & '"', '', @SW_HIDE)
EndFunc

Func _MKLink($sSymLink, $sTarget)
    RunWait(@ComSpec & ' /c MKLINK /J "' & $sSymLink & '" "' & $sTarget & '" && ATTRIB +S +H "' & $sSymLink & '" /L', '', @SW_HIDE)
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
наверное код в одну строку для вас = одна тема
Дело не в количестве строк кода, а в том что вокруг этого кода возникают вопросы, и они уже касаются другой темы.
 
Верх