Что нового

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

sas2242

Новичок
Сообщения
38
Репутация
0
Есть батник:

Код:
@ECHO OFF

SET "DISK=D:"

Rem Перемещение папок: Мои документы, Мои изображения, Моя музыка, Мои видеозаписи, Загрузки, Сохраненные игры и Рабочий стол на другой диск.
XCOPY "%USERPROFILE%\Downloads" "%DISK%\Downloads" /H /I /K /O /Q /S /Y || MD "%DISK%\Downloads"
XCOPY "%USERPROFILE%\Music" "%DISK%\Music" /H /I /K /O /Q /S /Y || MD "%DISK%\Music"
XCOPY "%USERPROFILE%\Pictures" "%DISK%\Pictures" /H /I /K /O /Q /S /Y || MD "%DISK%\Pictures"
XCOPY "%USERPROFILE%\Saved Games" "%DISK%\Saved Games" /H /I /K /O /Q /S /Y || MD "%DISK%\Saved Games"
XCOPY "%USERPROFILE%\Videos" "%DISK%\Videos" /H /I /K /O /Q /S /Y || MD "%DISK%\Videos"

REG ADD "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "{374DE290-123F-4565-9164-39C4925E467B}" /t REG_SZ /d "%DISK%\Downloads" /f
REG ADD "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "{374DE290-123F-4565-9164-39C4925E467B}" /t REG_EXPAND_SZ /d "%DISK%\Downloads" /f
REG ADD "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "My Music" /t REG_SZ /d "%DISK%\Music" /f
REG ADD "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "My Music" /t REG_EXPAND_SZ /d "%DISK%\Music" /f
REG ADD "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "My Pictures" /t REG_SZ /d "%DISK%\Pictures" /f
REG ADD "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "My Pictures" /t REG_EXPAND_SZ /d "%DISK%\Pictures" /f
REG ADD "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "{4C5C32FF-BB9D-43B0-B5B4-2D72E54EAAA4}" /t REG_SZ /d "%DISK%\Saved Games" /f
REG ADD "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "{4C5C32FF-BB9D-43B0-B5B4-2D72E54EAAA4}" /t REG_EXPAND_SZ /d "%DISK%\Saved Games" /f
REG ADD "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "My Video" /t REG_SZ /d "%DISK%\Videos" /f
REG ADD "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "My Video" /t REG_EXPAND_SZ /d "%DISK%\Videos" /f

RD /S /Q "%USERPROFILE%\Downloads"
RD /S /Q "%USERPROFILE%\Music"
RD /S /Q "%USERPROFILE%\Pictures"
RD /S /Q "%USERPROFILE%\Saved Games"
RD /S /Q "%USERPROFILE%\Videos"

XCOPY "%USERPROFILE%\Desktop" "%DISK%\Desktop" /H /I /K /O /Q /S /Y || MD "%DISK%\Desktop"
XCOPY "%USERPROFILE%\Documents" "%DISK%\Documents" /H /I /K /O /Q /S /Y || MD "%DISK%\Documents"

REG ADD "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Desktop" /t REG_SZ /d "%DISK%\Desktop" /f
REG ADD "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "Desktop" /t REG_EXPAND_SZ /d "%DISK%\Desktop" /f
REG ADD "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal" /t REG_SZ /d "%DISK%\Documents" /f
REG ADD "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "Personal" /t REG_EXPAND_SZ /d "%DISK%\Documents" /f
REG ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\DocFolderPaths" /v %USERNAME% /t REG_SZ /d "%DISK%\Documents" /f

RD /S /Q "%USERPROFILE%\Desktop"
RD /S /Q "%USERPROFILE%\Documents"

Rem Создание символьных ссылок в папке профиля (%UserProfile%).
MKLINK /J "%USERPROFILE%\Downloads" "%DISK%\Downloads"
MKLINK /J "%USERPROFILE%\Music" "%DISK%\Music"
MKLINK /J "%USERPROFILE%\Pictures" "%DISK%\Pictures"
MKLINK /J "%USERPROFILE%\Saved Games" "%DISK%\Saved Games"
MKLINK /J "%USERPROFILE%\Videos" "%DISK%\Videos"
MKLINK /J "%USERPROFILE%\Documents" "%DISK%\Documents"
MKLINK /J "%USERPROFILE%\Desktop" "%DISK%\Desktop"

Rem Добавление атрибутов "Скрытый\Системный" для символьных ссылок.
ATTRIB +H +S "%USERPROFILE%\Downloads" /L
ATTRIB +H +S "%USERPROFILE%\Music" /L
ATTRIB +H +S "%USERPROFILE%\Pictures" /L
ATTRIB +H +S "%USERPROFILE%\Saved Games" /L
ATTRIB +H +S "%USERPROFILE%\Videos" /L
ATTRIB +H +S "%USERPROFILE%\Documents" /L
ATTRIB +H +S "%USERPROFILE%\Desktop" /L

Rem Добавление атрибутов "Скрытый\Системный" для папки Рабочий стол.
ATTRIB +H +S "%DISK%\Desktop"

Rem Копирование личных папок и файлов.
XCOPY "%~dp0USERPROFILE" "%DISK%\" /E /H /I /K /Q /R /Y

EXIT
Задача такая, нужно перевести этот батник в скрипт и сделать так, чтобы SET "DISK=D:" был равен не только D:\ а и все остальные буквы возможных имеющихся дисков. Но обязательное условие, чтобы диск был = 'Fixed'. При запуске скрипта, он должен определять, есть ли в системе диск D:\, если есть, то выполняет все действия прописанные выше без всяких вопросов, если D:\ нет, то проверяет по порядку букв и если допустим D:\ нет, но есть диск E:\ то выдает сообщение: "Перенести пользовательские данные на диск E:\ ?" При нажатии на "Да" выполняет все действия написанные выше, если нажать "Нет" то выполняется DirCopy(@ScriptDir & '\USERPROFILE', @UserProfileDir, 1) Если в системе только один диск = 'Fixed', допустим C:\, то сразу выполняет DirCopy(@ScriptDir & '\USERPROFILE', @UserProfileDir, 1) без вопросов. Заранее огромное спасибо за помощь. P.S. в батнике reg add путь везде начинается с HKCU (HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\) но в одном случае он HKLM (HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\)
 
Последнее редактирование модератором:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
#RequireAdmin
#include <AutoItConstants.au3>

Global $sDisk = 'D:'
Global $sRegKey1 = 'HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer'
Global $sRegKey2 = 'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer'

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, 'Внимание', 'Перенести пользовательские данные на диск ' & $aDisks[$i] & '\?') = 6 Then
            $sDisk = $aDisks[$i]
            _Main()
            Exit
        Else
            ExitLoop
        EndIf
    Next
EndIf

DirCopy(@ScriptDir & '\USERPROFILE', @UserProfileDir, 1)

Func _Main()
    ;Перемещение папок: Мои документы, Мои изображения, Моя музыка, Мои видеозаписи, Загрузки, Сохраненные игры и Рабочий стол на другой диск.
    _XCopy('%USERPROFILE%\Downloads', $sDisk & '\Downloads')
    _XCopy('%USERPROFILE%\Music', $sDisk & '\Music')
    _XCopy('%USERPROFILE%\Pictures', $sDisk & '\Pictures')
    _XCopy('%USERPROFILE%\Saved Games', $sDisk & '\Saved Games')
    _XCopy('%USERPROFILE%\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')

    DirRemove(@UserProfileDir & '\Downloads', 1)
    DirRemove(@UserProfileDir & '\Music', 1)
    DirRemove(@UserProfileDir & '\Pictures', 1)
    DirRemove(@UserProfileDir & '\Saved Games', 1)
    DirRemove(@UserProfileDir & '\Videos', 1)

    _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')

    DirRemove(@UserProfileDir & '\Desktop', 1)
    DirRemove(@UserProfileDir & '\Documents', 1)

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

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

    ;Копирование личных папок и файлов.
    _XCopy('%~dp0USERPROFILE%', $sDisk & '\', '/E /H /I /K /Q /R /Y')
EndFunc

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

Func _RegAdd($sRegKey, $sKey1, $sKey2, $sValName, $sValue)
    RegWrite($sRegKey & '\' & $sKey1, $sValName, 'REG_SZ', $sValue)
    
    If $sKey2 Then
        RegWrite($sRegKey & '\' & $sKey2, $sValName, 'REG_EXPAND_SZ', $sValue)
    EndIf
EndFunc

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

sas2242

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

Global $sDisk = 'D:'
Global $sRegKey1 = 'HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer'
Global $sRegKey2 = 'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer'

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, 'Внимание', 'Перенести пользовательские данные на диск ' & $aDisks[$i] & '\?') = 6 Then
            $sDisk = $aDisks[$i]
            _Main()
            Exit
        Else
            ExitLoop
        EndIf
    Next
EndIf

DirCopy(@ScriptDir & '\USERPROFILE', @UserProfileDir, 1)

Func _Main()
    ;Перемещение папок: Мои документы, Мои изображения, Моя музыка, Мои видеозаписи, Загрузки, Сохраненные игры и Рабочий стол на другой диск.
    _XCopy('%USERPROFILE%\Downloads', $sDisk & '\Downloads')
    _XCopy('%USERPROFILE%\Music', $sDisk & '\Music')
    _XCopy('%USERPROFILE%\Pictures', $sDisk & '\Pictures')
    _XCopy('%USERPROFILE%\Saved Games', $sDisk & '\Saved Games')
    _XCopy('%USERPROFILE%\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')

    DirRemove(@UserProfileDir & '\Downloads', 1)
    DirRemove(@UserProfileDir & '\Music', 1)
    DirRemove(@UserProfileDir & '\Pictures', 1)
    DirRemove(@UserProfileDir & '\Saved Games', 1)
    DirRemove(@UserProfileDir & '\Videos', 1)

    _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')

    DirRemove(@UserProfileDir & '\Desktop', 1)
    DirRemove(@UserProfileDir & '\Documents', 1)

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

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

    ;Копирование личных папок и файлов.
    _XCopy('%~dp0USERPROFILE%', $sDisk & '\', '/E /H /I /K /Q /R /Y')
EndFunc

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

Func _RegAdd($sRegKey, $sKey1, $sKey2, $sValName, $sValue)
    RegWrite($sRegKey & '\' & $sKey1, $sValName, 'REG_SZ', $sValue)

    If $sKey2 Then
        RegWrite($sRegKey & '\' & $sKey2, $sValName, 'REG_EXPAND_SZ', $sValue)
    EndIf
EndFunc

Func _MKLink($sSymLink, $sTarget)
    RunWait(@ComSpec & ' /c MKLINK /J "' & $sSymLink & '" "' & $sTarget & '" && ATTRIB +H +S "' & $sSymLink & '" /L', '', @SW_HIDE)
EndFunc
Спасибо вам огромное, Вы лучший. Только один нюанс, команда _XCopy('%~dp0USERPROFILE%', $sDisk & '\', '/E /H /I /K /Q /R /Y') почему-то не выполняет копирование файлов, а все остальное работает отлично. Единственное, если можно сделать так, чтобы в сообщении буква диска отображалась большой "Перенести пользовательские данные на диск E:\" было бы вообще замечательно.
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
почему-то не выполняет копирование файлов
Код:
_XCopy('%~dp0USERPROFILE', $sDisk & '\', '/E /H /I /K /Q /R /Y')


сделать так, чтобы в сообщении буква диска отображалась большой
Код:
ElseIf MsgBox(36, 'Внимание', 'Перенести пользовательские данные на диск ' & StringUpper($aDisks[$i]) & '\?') = 6 Then
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
А так:
Код:
_XCopy('%~dp0USERPROFILE', $sDisk & '\', '/E /H /I /K /Q /R /Y')

...

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


?

А DirCopy(@ScriptDir & '\USERPROFILE', $sDisk & '\', 1) копирует
Ну так почему не использовать это?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Так тоже не работает.
Тогда так:
Код:
_XCopy(@ScriptDir & '\USERPROFILE', $sDisk & '\', '/E /H /I /K /Q /R /Y')


Ты меня заставил вспомнить мои первые похождения в мир кодинга, когда я только начинал с батников )).
 
Автор
S

sas2242

Новичок
Сообщения
38
Репутация
0
_XCopy(@ScriptDir & '\USERPROFILE', $sDisk & '\', '/E /H /I /K /Q /R /Y')
Так работает, спасибо.

Ты меня заставил вспомнить мои первые похождения в мир кодинга, когда я только начинал с батников )).
Надеюсь когда-нибудь и я осилю хоть немного из этого всего. А пока только от вида такого количества букаФФФ у меня голова кружится начинает. :rofl:

оставил в конечном результате вот так:

Код:
_XCopy(@ScriptDir & '\USERPROFILE', $sDisk & '\', '/E /H /I /K /Q /R /Y')
EndFunc

Func _XCopy($sSrc, $sDst, $sParams = '/H /I /K /O /Q /S /Y')
    RunWait(@ComSpec & ' /c XCOPY "' & $sSrc & '" "' & $sDst & '" ' & $sParams & ' || MD "' & $sDst & '"', '', @SW_HIDE)
EndFunc
Сообщение автоматически объединено:

Нашел еще один момент, "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\DocFolderPaths" пишется в Wow6432Node а надо как в скрипте.
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
"HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\DocFolderPaths" пишется в Wow6432Node а надо как в скрипте.
А если попробовать так:
Код:
#include <WinAPIFiles.au3>

_WinAPI_Wow64EnableWow64FsRedirection(False)

;Далее тело скрипта
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Хотя скорее всего это не сработает, т.к запускаешь видимо 32-битный скрипт на 64-битной системе.
Нужно либо компилировать/запускать скрипт в 64-битной разрядности, либо делать так:

Код:
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


(заменить эту функцию в скрипте)
 
Автор
S

sas2242

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

Код:
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


(заменить эту функцию в скрипте)
Да, действительно, скомпилировал скрипт в х64 и все заработало как надо. Но мне нужно, чтобы этот скрипт запускался и работал как на 32 так и на х64 системе. Код выше работает когда есть
Код:
#include <WinAPIFiles.au3>

_WinAPI_Wow64EnableWow64FsRedirection(False)
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Исправленный вариант с учётом всех выше перечисленных исправлении + тех что были озвучены в ЛС.

Код:
#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 $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(@ScriptDir & '\USERPROFILE', @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')
  
    ;Создание символьных ссылок в папке профиля (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 & '\Documents', $sDisk & '\Documents')
    _MKLink@UserProfileDir & '\Desktop', $sDisk & '\Desktop')
  
    ;Добавление атрибутов "Скрытый\Системный" для папки Рабочий стол.
    FileSetAttrib($sDisk & '\Desktop', '+SH')
  
    ;Копирование личных папок и файлов.
    _XCopy(@ScriptDir & '\USERPROFILE', $sDisk & '\', '/E /H /I /K /Q /R /Y')
    
    ;Обновление проводника
    _WinAPI_ShellChangeNotify($SHCNE_ASSOCCHANGED, BitOR($SHCNF_IDLIST, $SHCNF_FLUSH))
    _WinAPI_ShellChangeNotify($SHCNE_ALLEVENTS, BitOR($SHCNF_IDLIST, $SHCNF_FLUSH))
EndFunc

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

Func _RD($sPath)
    RunWait(@ComSpec & ' /c RD /S /Q "' & $sPath & '"', '', @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 _MKLink($sSymLink, $sTarget)
    RunWait(@ComSpec & ' /c MKLINK /J "' & $sSymLink & '" "' & $sTarget & '" && ATTRIB +H +S "' & $sSymLink & '" /L', '', @SW_HIDE)
EndFunc
 
Последнее редактирование:
Автор
S

sas2242

Новичок
Сообщения
38
Репутация
0
Исправленный вариант с учётом всех выше перечисленных исправлении + тех что были озвучены в ЛС.

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

_WinAPI_Wow64EnableWow64FsRedirection(False)

Global $sDisk = 'D:'
Global $sRegKey1 = 'HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer'
Global $sRegKey2 = 'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer'

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(@ScriptDir & '\USERPROFILE', @UserProfileDir, 1)

Func _Main()
    ;Перемещение папок: Мои документы, Мои изображения, Моя музыка, Мои видеозаписи, Загрузки, Сохраненные игры и Рабочий стол на другой диск.
    _XCopy('C:\Users\mrgeo\Downloads', $sDisk & '\Downloads')
    _XCopy('C:\Users\mrgeo\Music', $sDisk & '\Music')
    _XCopy('C:\Users\mrgeo\Pictures', $sDisk & '\Pictures')
    _XCopy('C:\Users\mrgeo\Saved Games', $sDisk & '\Saved Games')
    _XCopy('C:\Users\mrgeo\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('C:\Users\mrgeo\Downloads', $sDisk & '\Downloads')
    _MKLink('C:\Users\mrgeo\Music', $sDisk & '\Music')
    _MKLink('C:\Users\mrgeo\Pictures', $sDisk & '\Pictures')
    _MKLink('C:\Users\mrgeo\Saved Games', $sDisk & '\Saved Games')
    _MKLink('C:\Users\mrgeo\Videos', $sDisk & '\Videos')
    _MKLink('C:\Users\mrgeo\Documents', $sDisk & '\Documents')
    _MKLink('C:\Users\mrgeo\Desktop', $sDisk & '\Desktop')

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

    ;Копирование личных папок и файлов.
    _XCopy(@ScriptDir & '\USERPROFILE', $sDisk & '\', '/E /H /I /K /Q /R /Y')
EndFunc

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

Func _RD($sPath)
    RunWait(@ComSpec & ' /c RD /S /Q "' & $sPath & '"', '', @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 _MKLink($sSymLink, $sTarget)
    RunWait(@ComSpec & ' /c MKLINK /J "' & $sSymLink & '" "' & $sTarget & '" && ATTRIB +H +S "' & $sSymLink & '" /L', '', @SW_HIDE)
EndFunc
Спасибо большое, вы как всегда на высоте. Я уже и не надеялся, подумал, что задолбал вас в край ((. Там у вас немного путаница в путях, видимо %UserProfile% с конвертировался обратно, но я поправил, в итоге получился вот такой вот скрипт

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

_WinAPI_Wow64EnableWow64FsRedirection(False)

Global $sDisk = 'D:'
Global $sRegKey1 = 'HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer'
Global $sRegKey2 = 'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer'

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%).
    _XCopy(@ScriptDir & '\USFOLDERS', @UserProfileDir, '/E /H /I /K /Q /R /Y')

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 & '\Documents', $sDisk & '\Documents')
    _MKLink(@UserProfileDir & '\Desktop', $sDisk & '\Desktop')

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

    ;Копирование личных папок и файлов в ($sDisk).
    _XCopy(@ScriptDir & '\USFOLDERS', $sDisk & '\', '/E /H /I /K /Q /R /Y')
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
Сообщение автоматически объединено:

У меня собственно крайний вопрос, в команде _XCopy(@ScriptDir & '\USFOLDERS', $sDisk & '\', '/E /H /I /K /Q /R /Y') нужно ли писать слеш в \USFOLDERS ведь @ScriptDir принимает значение путь\ в итоге получается C:\\USFOLDERS а если писать так 'USFOLDERS' то C:\USFOLDERS хотя в обоих случаях копирует нормально вроде. И можно ли как то добавить в скрипт отключение explorer.exe на момент работы скрипта и его соответственно включение, после того как скрипт отработал. (желательно, чтобы это независимая функция была, чтобы ее можно было закомментировать и скрипт работал и без нее) Спасибо.
Сообщение автоматически объединено:

Нашел кстати ваш пост со скриптом http://autoit-script.ru/threads/neoficialnyj-faq-autoit.3925/post-40663 заморозить explorer получилось а вот разморозить нет :smile: оч интересный скрипт однако. Я и не думал, что такое вообще возможно.
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Там у вас немного путаница в путях, видимо %UserProfile% с конвертировался обратно
Интересно, как это могла произойти...

нужно ли писать слеш в \USFOLDERS ведь @ScriptDir принимает значение путь\ в итоге получается C:\\USFOLDERS а если писать так 'USFOLDERS' то C:\USFOLDERS хотя в обоих случаях копирует нормально вроде
Работает и так и так, хотя корректнее убирать слэш:
Код:
Global $sScriptDir = _ScriptDir() ; $sScriptDir далее можно использовать как замену @ScriptDir

...

Func _ScriptDir()
    Return StringRegExpReplace(@ScriptDir, '\\$', '')
EndFunc
 
Автор
S

sas2242

Новичок
Сообщения
38
Репутация
0
Что имеется в виду под отключением? И зачем?
Просто обратил внимание на такую вещь, что команда _MKLink(@UserProfileDir & '\Desktop', $sDisk & '\Desktop') не всегда отрабатывает правильно. То есть через раз, один раз она создает символьную ссылку Desktop в папке пользователя а 3 раза нет. Как мне удалась понять, это происходит в тот момент, когда открыт проводник. При том, не обязательно вырубать процесс explorer.exe, достаточно чтобы на момент выполнения скрипта, не было открыто никаких окон, например мой компьютер или еще что-то, и тогда скрипт в 99.9% отрабатывает нормально. Ну как вариант, можно сделать, чтобы на момент выполнения скрипта, проводник вообще закрывался, то есть выгружался процесс explorer.exe и после того как скрипт отработал, снова запускался. start explorer.exe
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
один раз она создает символьную ссылку Desktop в папке пользователя а 3 раза нет
Скорее всего дело в обновлений (прогрузке) проводника, и на самом деле ссылки создаются, можно попробовать по завершению всех операции обновить проводник:
Код:
#Include <WinAPIShellEx.au3> ;Это в начало скрипта

...

;Это в конец
_WinAPI_ShellChangeNotify($SHCNE_ASSOCCHANGED, BitOR($SHCNF_IDLIST, $SHCNF_FLUSH))
_WinAPI_ShellChangeNotify($SHCNE_ALLEVENTS, BitOR($SHCNF_IDLIST, $SHCNF_FLUSH))


Обновил своё сообщение соответственно.
 
Последнее редактирование:
Автор
S

sas2242

Новичок
Сообщения
38
Репутация
0
Скорее всего дело в обновлений (прогрузке) проводника, и на самом деле ссылки создаются, можно попробовать по завершению всех операции обновить проводник:
Код:
#Include <WinAPIShellEx.au3> ;Это в начало скрипта

...

;Это в конец
_WinAPI_ShellChangeNotify($SHCNE_ASSOCCHANGED, BitOR($SHCNF_IDLIST, $SHCNF_FLUSH))
_WinAPI_ShellChangeNotify($SHCNE_ALLEVENTS, BitOR($SHCNF_IDLIST, $SHCNF_FLUSH))


Обновил своё сообщение соответственно.
нет, это не помогает. ссылка конкретно не создается, пишет нет доступа или что-то в этом роде(все другие ссылки создаются, только эта нет). я проверял и перезагружал, после выполнения скрипта и так далее. А вот если проводник закрыт, даже не то чтобы выгружен, а просто не открыты никакие окна в проводнике, то скрипт всегда отрабатывает как надо. На Windows 7 вроде я смотрел и там такого нет, там всегда отрабатывает, а вот на Windows 10 такая беда.
 
Последнее редактирование:
Верх