Батник автоматического бэкапа сейвов игр

  • Автор темы Автор темы Y2k18
  • Дата начала Дата начала

Переводчик Google

Y2k18

Новый пользователь
Сообщения
22
Реакции
0
Добрый день. Нужно создать батник, который должен запускаться из планировщика задач windows.
Цель батника: 1. Отслеживать запуск определённого exe-файла. 2. Пока ехе-файл исполняется - батник должен с периодичностью 30 минут копировать папки и файлы с заменой без вывода подтверждения из директории A в директорию B с сохранением структуры каталогов и подкаталогов, но только те папки и файлы, которые были изменены. 3. После закрытия exe-файла батник завершает свою работу.

Говоря простыми словами, мне нужен батник, который будет постоянно висеть в системе запущенным и делать бэкапы сейвов игр, запущенных на эмуляторе XBOX360 Xenia Canary в отдельный каталог. Связано это с тем, что Xenia иногда вылетает после сейва в игре, из-за чего сейв повреждается и приходится проходить игру с самого начала.

Пока что я пришёл к такому варианту:
В планировщике создана задача, которая запускается при запуске компьютера и выполняет батник раз в 30 минут с таким кодом.
Код:
xcopy /E /I /Y "G:\Soft\XeniaCanary\content\4D5307F1\." "D:\Saves\XBOX360\4D5307F1 Fable 2\."
xcopy /E /I /Y "G:\Soft\XeniaCanary\content\4D53085B\." "D:\Saves\XBOX360\4D53085B Halo Reach\."
xcopy /E /I /Y "G:\Soft\XeniaCanary\content\4D5309B1\." "D:\Saves\XBOX360\4D5309B1 Halo CE Anniversary\."
xcopy /E /I /Y "G:\Soft\XeniaCanary\content\4D5307E6\." "D:\Saves\XBOX360\4D5307E6 Halo 3\."
xcopy /E /I /Y "G:\Soft\XeniaCanary\content\4D530877\." "D:\Saves\XBOX360\4D530877 Halo 3 ODST\."
xcopy /E /I /Y "G:\Soft\XeniaCanary\content\4D530808\." "D:\Saves\XBOX360\4D530808 Halo Wars\."

Держать задачу постоянно запущенной нерационально, поэтому большую часть времени задача отключена. Для того, чтобы не открывать планировщик каждый раз, создан батник, запускающий, запускающий задачу в планировщике вместе с эмулятором.
Код:
start "" "G:\Soft\XeniaCanary\xenia_canary.exe"
SchTasks /Change /TN "\Xbox360 backup saves" /Enable

После того, как я заканчиваю играть, приходится отключать задачу в планировщике вручную, и, опять же, чтобы не открывать планировщик каждый раз, был создан ещё один батник.
Код:
SchTasks /Change /TN "\Xbox360 backup saves" /Disable

Подскажите, как оптимизировать батник?
 
Добрый день!

Вы уже сделали неплохую работу по созданию батников и настройке планировщика задач. Давайте оптимизируем ваш процесс, чтобы сделать его более эффективным и менее зависимым от ручного вмешательства.

### Общая структура батника

1. Отслеживание процесса: Вам нужно следить за тем, запущен ли ваш exe-файл. Для этого мы можем использовать цикл, который будет проверять наличие процесса.
2. Копирование файлов: Используйте robocopy вместо xcopy, так как он более надежен для задач синхронизации и копирования.
3. Автоматизация: Вместо того чтобы запускать задачу через планировщик, можно просто оставить батник работающим в фоновом режиме.

### Пример батника

Вот пример, который включает все вышеперечисленное:

CMD/BATCH:
@echo off
setlocal

set "source=G:\Soft\XeniaCanary\content"
set "destination=D:\Saves\XBOX360"
set "process_name=xenia_canary.exe"

:loop
rem Проверяем, запущен ли процесс
tasklist /FI "IMAGENAME eq %process_name%" | find /I "%process_name%" >nul
if not errorlevel 1 (
    rem Копируем файлы каждые 30 минут
    robocopy "%source%\4D5307F1" "%destination%\4D5307F1 Fable 2" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D53085B" "%destination%\4D53085B Halo Reach" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D5309B1" "%destination%\4D5309B1 Halo CE Anniversary" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D5307E6" "%destination%\4D5307E6 Halo 3" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D530877" "%destination%\4D530877 Halo 3 ODST" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D530808" "%destination%\4D530808 Halo Wars" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    
    rem Ждем 30 минут
    timeout /t 1800 /nobreak
) else (
    rem Если процесс не запущен, выходим
    exit /b
)

goto loop

### Объяснение кода

1. Проверка процесса: tasklist проверяет, запущен ли процесс. Если он запущен, выполняется блок копирования.
2. Копирование файлов: Используется robocopy, который более устойчив к ошибкам и имеет больше возможностей, чем xcopy. Параметры:
- /E — копировать все подкаталоги.
- /COPY:DAT — копировать данные, атрибуты и временные метки.
- /MINAGE:1 — копировать только измененные файлы (вы можете настроить этот параметр по необходимости).
- /XD "Thumbs.db" — исключить определенные файлы или папки.
- /R:0 /W:0 — не повторять попытки при ошибках.
3. Ожидание: timeout /t 1800 /nobreak делает паузу на 30 минут, не прерываясь.

### Запуск батника

Запустите этот батник при старте системы через планировщик задач, как вы уже делали. Он будет работать в фоновом режиме и выполнять необходимые задачи.

### Остановка батника

Чтобы остановить батник, вы можете просто закрыть его окно или использовать другой батник, который завершает процесс, если это необходимо.

Если у вас есть дополнительные вопросы или нужно что-то уточнить, дайте знать!
 
Добрый день!

Вы уже сделали неплохую работу по созданию батников и настройке планировщика задач. Давайте оптимизируем ваш процесс, чтобы сделать его более эффективным и менее зависимым от ручного вмешательства.

### Общая структура батника

1. Отслеживание процесса: Вам нужно следить за тем, запущен ли ваш exe-файл. Для этого мы можем использовать цикл, который будет проверять наличие процесса.
2. Копирование файлов: Используйте robocopy вместо xcopy, так как он более надежен для задач синхронизации и копирования.
3. Автоматизация: Вместо того чтобы запускать задачу через планировщик, можно просто оставить батник работающим в фоновом режиме.

### Пример батника

Вот пример, который включает все вышеперечисленное:

CMD/BATCH:
@echo off
setlocal

set "source=G:\Soft\XeniaCanary\content"
set "destination=D:\Saves\XBOX360"
set "process_name=xenia_canary.exe"

:loop
rem Проверяем, запущен ли процесс
tasklist /FI "IMAGENAME eq %process_name%" | find /I "%process_name%" >nul
if not errorlevel 1 (
    rem Копируем файлы каждые 30 минут
    robocopy "%source%\4D5307F1" "%destination%\4D5307F1 Fable 2" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D53085B" "%destination%\4D53085B Halo Reach" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D5309B1" "%destination%\4D5309B1 Halo CE Anniversary" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D5307E6" "%destination%\4D5307E6 Halo 3" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D530877" "%destination%\4D530877 Halo 3 ODST" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D530808" "%destination%\4D530808 Halo Wars" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
   
    rem Ждем 30 минут
    timeout /t 1800 /nobreak
) else (
    rem Если процесс не запущен, выходим
    exit /b
)

goto loop

### Объяснение кода

1. Проверка процесса: tasklist проверяет, запущен ли процесс. Если он запущен, выполняется блок копирования.
2. Копирование файлов: Используется robocopy, который более устойчив к ошибкам и имеет больше возможностей, чем xcopy. Параметры:
- /E — копировать все подкаталоги.
- /COPY:DAT — копировать данные, атрибуты и временные метки.
- /MINAGE:1 — копировать только измененные файлы (вы можете настроить этот параметр по необходимости).
- /XD "Thumbs.db" — исключить определенные файлы или папки.
- /R:0 /W:0 — не повторять попытки при ошибках.
3. Ожидание: timeout /t 1800 /nobreak делает паузу на 30 минут, не прерываясь.

### Запуск батника

Запустите этот батник при старте системы через планировщик задач, как вы уже делали. Он будет работать в фоновом режиме и выполнять необходимые задачи.

### Остановка батника

Чтобы остановить батник, вы можете просто закрыть его окно или использовать другой батник, который завершает процесс, если это необходимо.

Если у вас есть дополнительные вопросы или нужно что-то уточнить, дайте знать!
Копирование происходит без запроса подтверждения?
 
Копирование происходит без запроса подтверждения?
Да, в приведенном примере батника копирование происходит без запроса подтверждения. Это достигается благодаря параметрам, которые используются с командой robocopy.

### Как это работает:

1. Без подтверждений: robocopy по умолчанию не требует подтверждения для копирования файлов. Он просто выполнит задачу копирования, если у вас есть права на доступ к исходным и целевым папкам.

2. Использование параметров:
- Параметры /R:0 и /W:0 указывают, что если произойдет ошибка (например, файл уже существует), то повторные попытки не будут выполняться, и программа просто продолжит выполнение. Это также исключает любые запросы на подтверждение.

### Если вам нужно добавить подтверждение:

Если вы хотите, чтобы robocopy запрашивал подтверждение перед перезаписью существующих файлов, вам нужно будет изменить подход, так как robocopy не имеет встроенной опции для этого. Вместо этого вы можете использовать стандартные команды Windows, такие как xcopy, но с ним нужно быть осторожным, так как он может не быть таким устойчивым.

Вот пример использования xcopy, который будет запрашивать подтверждение:

CMD/BATCH:
xcopy "%source%\4D5307F1" "%destination%\4D5307F1 Fable 2" /E /I /Y

- Параметр /Y отключает запрос на подтверждение перезаписи. Если хотите, чтобы запрос был включен, просто уберите этот параметр.

### Резюме

Таким образом, в вашем текущем батнике с robocopy не будет никаких запросов на подтверждение, и файлы будут копироваться автоматически. Если вам нужно добавлять подтверждения, вам придется использовать другие команды или модифицировать логику батника.

Если у вас есть еще вопросы или нужна дополнительная помощь, дайте знать!
 
CMD/BATCH:
    robocopy "%source%\4D5307F1" "%destination%\4D5307F1 Fable 2" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D53085B" "%destination%\4D53085B Halo Reach" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D5309B1" "%destination%\4D5309B1 Halo CE Anniversary" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D5307E6" "%destination%\4D5307E6 Halo 3" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D530877" "%destination%\4D530877 Halo 3 ODST" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D530808" "%destination%\4D530808 Halo Wars" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
Получится оптимизировать эту часть кода? Здесь для каждой игры приходится создавать отдельную строку. Нужно, чтобы батник копировал папки и файлы из исходного каталога %source% в каталог %destination%, при условии если в каталоге %destination% первые 8 символов имён папок соответствуют первыми 8 символам имён папок в каталоге %source%, игнорируя остальные символы.
 
CMD/BATCH:
    robocopy "%source%\4D5307F1" "%destination%\4D5307F1 Fable 2" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D53085B" "%destination%\4D53085B Halo Reach" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D5309B1" "%destination%\4D5309B1 Halo CE Anniversary" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D5307E6" "%destination%\4D5307E6 Halo 3" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D530877" "%destination%\4D530877 Halo 3 ODST" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D530808" "%destination%\4D530808 Halo Wars" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
Получится оптимизировать эту часть кода? Здесь для каждой игры приходится создавать отдельную строку. Нужно, чтобы батник копировал папки и файлы из исходного каталога %source% в каталог %destination%, при условии если в каталоге %destination% первые 8 символов имён папок соответствуют первыми 8 символам имён папок в каталоге %source%, игнорируя остальные символы.
Да, вы можете оптимизировать ваш код, используя цикл в бат-файле для обработки папок. Это позволит избежать повторяющегося кода и упростит его поддержку. Вот как это можно сделать:

CMD/BATCH:
@echo off
setlocal enabledelayedexpansion

set "source=%source%"
set "destination=%destination%"

for /d %%D in ("%source%\*") do (
    set "folderName=%%~nxD"
    set "shortName=!folderName:~0,8!"  REM Получаем первые 8 символов имени папки

    REM Формируем путь назначения
    set "destFolder=!shortName! !folderName:~9!"  REM Остальная часть имени после первых 8 символов
    set "destPath=%destination%\!destFolder!"

    REM Копируем папку, если она существует в каталоге назначения
    if exist "!destPath!" (
        robocopy "%%D" "!destPath!" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    )
)

endlocal

### Объяснение кода:

1. Цикл for /d %%D in ("%source%\*"): Проходит по всем папкам в исходном каталоге.
2. set "folderName=%%~nxD": Получает имя текущей папки.
3. set "shortName=!folderName:~0,8!": Извлекает первые 8 символов имени папки.
4. set "destFolder=!shortName! !folderName:~9!": Формирует новое имя папки для назначения, добавляя оставшуюся часть имени.
5. if exist "!destPath!": Проверяет, существует ли папка назначения, прежде чем выполнять robocopy.
6. robocopy: Копирует содержимое папки из исходного каталога в целевой, если папка назначения существует.

### Примечания:
  • Убедитесь, что вы заменили %source% и %destination% на фактические пути к вашим каталогам.
  • Этот код будет работать только в том случае, если имена папок в источнике и назначении имеют одинаковую длину в первых 8 символах. Если это не так, вам, возможно, потребуется немного изменить логику.

Если у вас есть дополнительные требования или вопросы, не стесняйтесь спрашивать!
 
Объедини эти два батника в один с учётом последней оптимизации

CMD/BATCH:
@echo off
setlocal

set "source=G:\Soft\XeniaCanary\content"
set "destination=D:\Saves\XBOX360"
set "process_name=xenia_canary.exe"

:loop
rem Проверяем, запущен ли процесс
tasklist /FI "IMAGENAME eq %process_name%" | find /I "%process_name%" >nul
if not errorlevel 1 (
    rem Копируем файлы каждые 30 минут
    robocopy "%source%\4D5307F1" "%destination%\4D5307F1 Fable 2" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D53085B" "%destination%\4D53085B Halo Reach" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D5309B1" "%destination%\4D5309B1 Halo CE Anniversary" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D5307E6" "%destination%\4D5307E6 Halo 3" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D530877" "%destination%\4D530877 Halo 3 ODST" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D530808" "%destination%\4D530808 Halo Wars" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    
    rem Ждем 30 минут
    timeout /t 1800 /nobreak
) else (
    rem Если процесс не запущен, выходим
    exit /b
)

goto loop

CMD/BATCH:
@echo off
setlocal enabledelayedexpansion

set "source=%source%"
set "destination=%destination%"

for /d %%D in ("%source%\*") do (
    set "folderName=%%~nxD"
    set "shortName=!folderName:~0,8!"  REM Получаем первые 8 символов имени папки

    REM Формируем путь назначения
    set "destFolder=!shortName! !folderName:~9!"  REM Остальная часть имени после первых 8 символов
    set "destPath=%destination%\!destFolder!"

    REM Копируем папку, если она существует в каталоге назначения
    if exist "!destPath!" (
        robocopy "%%D" "!destPath!" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    )
)

endlocal
 
Объедини эти два батника в один с учётом последней оптимизации

CMD/BATCH:
@echo off
setlocal

set "source=G:\Soft\XeniaCanary\content"
set "destination=D:\Saves\XBOX360"
set "process_name=xenia_canary.exe"

:loop
rem Проверяем, запущен ли процесс
tasklist /FI "IMAGENAME eq %process_name%" | find /I "%process_name%" >nul
if not errorlevel 1 (
    rem Копируем файлы каждые 30 минут
    robocopy "%source%\4D5307F1" "%destination%\4D5307F1 Fable 2" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D53085B" "%destination%\4D53085B Halo Reach" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D5309B1" "%destination%\4D5309B1 Halo CE Anniversary" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D5307E6" "%destination%\4D5307E6 Halo 3" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D530877" "%destination%\4D530877 Halo 3 ODST" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D530808" "%destination%\4D530808 Halo Wars" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    
    rem Ждем 30 минут
    timeout /t 1800 /nobreak
) else (
    rem Если процесс не запущен, выходим
    exit /b
)

goto loop

CMD/BATCH:
@echo off
setlocal enabledelayedexpansion

set "source=%source%"
set "destination=%destination%"

for /d %%D in ("%source%\*") do (
    set "folderName=%%~nxD"
    set "shortName=!folderName:~0,8!"  REM Получаем первые 8 символов имени папки

    REM Формируем путь назначения
    set "destFolder=!shortName! !folderName:~9!"  REM Остальная часть имени после первых 8 символов
    set "destPath=%destination%\!destFolder!"

    REM Копируем папку, если она существует в каталоге назначения
    if exist "!destPath!" (
        robocopy "%%D" "!destPath!" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    )
)

endlocal
Чтобы объединить два батника в один с учетом последней оптимизации, мы можем использовать подход с циклом, который будет проверять наличие процесса и копировать файлы из всех папок в указанной директории. Вот объединённый батник:

CMD/BATCH:
@echo off
setlocal enabledelayedexpansion

set "source=G:\Soft\XeniaCanary\content"
set "destination=D:\Saves\XBOX360"
set "process_name=xenia_canary.exe"

:loop
rem Проверяем, запущен ли процесс
tasklist /FI "IMAGENAME eq %process_name%" | find /I "%process_name%" >nul
if not errorlevel 1 (
    rem Копируем файлы для указанных игр
    robocopy "%source%\4D5307F1" "%destination%\4D5307F1 Fable 2" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D53085B" "%destination%\4D53085B Halo Reach" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D5309B1" "%destination%\4D5309B1 Halo CE Anniversary" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D5307E6" "%destination%\4D5307E6 Halo 3" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D530877" "%destination%\4D530877 Halo 3 ODST" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    robocopy "%source%\4D530808" "%destination%\4D530808 Halo Wars" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0

    rem Копирование остальных папок
    for /d %%D in ("%source%\*") do (
        set "folderName=%%~nxD"
        set "shortName=!folderName:~0,8!"  REM Получаем первые 8 символов имени папки
        set "destFolder=!shortName! !folderName:~9!"  REM Остальная часть имени после первых 8 символов
        set "destPath=%destination%\!destFolder!"  REM Формируем путь назначения

        rem Копируем папку, если она существует в каталоге назначения
        if exist "!destPath!" (
            robocopy "%%D" "!destPath!" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
        )
    )

    rem Ждем 30 минут
    timeout /t 1800 /nobreak
) else (
    rem Если процесс не запущен, выходим
    exit /b
)
goto loop

### Объяснение изменений:
1. Объединение циклов: Мы объединили оба скрипта в один, где сначала выполняется проверка на запущенный процесс, а затем выполняются копирования как для указанных игр, так и для всех папок в директории source.
2. Улучшение читаемости: Использование переменных и отступов делает код более читаемым.
3. Удаление дублирования: Удалены повторяющиеся строки, которые присваивали значения переменным, чтобы избежать путаницы.

### Дополнительные рекомендации:
  • Убедитесь, что пути к папкам source и destination указаны правильно.
  • Проверьте, что у вас есть права доступа к копируемым файлам и папкам.
  • Если у вас есть дополнительные вопросы или нужны изменения, дайте знать!
 
CMD/BATCH:
@echo off
setlocal enabledelayedexpansion

set "source=G:\Soft\XeniaCanary\content"
set "destination=D:\Saves\XBOX360"
set "process_name=xenia_canary.exe"

:loop
rem Проверяем, запущен ли процесс
tasklist /FI "IMAGENAME eq %process_name%" | find /I "%process_name%" >nul
if not errorlevel 1 (
    rem Копирование всех папок
    for /d %%D in ("%source%\*") do (
        set "folderName=%%~nxD"
        set "shortName=!folderName:~0,8!"  REM Получаем первые 8 символов имени папки
        set "destFolder=!shortName! !folderName:~9!"  REM Остальная часть имени после первых 8 символов
        set "destPath=%destination%\!destFolder!"  REM Формируем путь назначения

        rem Копируем папку, если она существует в каталоге назначения
        if exist "!destPath!" (
            robocopy "%%D" "!destPath!" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
        )
    )

    rem Ждем 30 минут
    timeout /t 1800 /nobreak
) else (
    rem Если процесс не запущен, выходим
    exit /b
)
goto loop

Я убрал ненужное копирование одиночных папок, оптимизировав скрипт. Но возникла другая проблема. В планировщике задач стоит выполнение при запуске компьютера. Происходит следующее: при запуске компьютера планировщик запускает этот батник, скрипт отрабатывает, не видит запущенный процесс xenia и закрывает батник, вместо того, чтобы оставаться в фоне. Нужно изменить скрипт так, чтобы батник был в фоне постоянно. Желательно, чтобы он запускался скрытым с панели задач.
 
CMD/BATCH:
@echo off
setlocal enabledelayedexpansion

set "source=G:\Soft\XeniaCanary\content"
set "destination=D:\Saves\XBOX360"
set "process_name=xenia_canary.exe"

:loop
rem Проверяем, запущен ли процесс
tasklist /FI "IMAGENAME eq %process_name%" | find /I "%process_name%" >nul
if not errorlevel 1 (
    rem Копирование всех папок
    for /d %%D in ("%source%\*") do (
        set "folderName=%%~nxD"
        set "shortName=!folderName:~0,8!"  REM Получаем первые 8 символов имени папки
        set "destFolder=!shortName! !folderName:~9!"  REM Остальная часть имени после первых 8 символов
        set "destPath=%destination%\!destFolder!"  REM Формируем путь назначения

        rem Копируем папку, если она существует в каталоге назначения
        if exist "!destPath!" (
            robocopy "%%D" "!destPath!" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
        )
    )

    rem Ждем 30 минут
    timeout /t 1800 /nobreak
) else (
    rem Если процесс не запущен, выходим
    exit /b
)
goto loop

Я убрал ненужное копирование одиночных папок, оптимизировав скрипт. Но возникла другая проблема. В планировщике задач стоит выполнение при запуске компьютера. Происходит следующее: при запуске компьютера планировщик запускает этот батник, скрипт отрабатывает, не видит запущенный процесс xenia и закрывает батник, вместо того, чтобы оставаться в фоне. Нужно изменить скрипт так, чтобы батник был в фоне постоянно. Желательно, чтобы он запускался скрытым с панели задач.
Для того чтобы ваш батник работал в фоновом режиме и не закрывался сразу после запуска, вам нужно внести несколько изменений в ваш скрипт. Также, чтобы запустить его скрыто, вы можете использовать start с параметром /B и cmd с параметром /C.

Вот обновленный вариант вашего скрипта:

CMD/BATCH:
@echo off
setlocal enabledelayedexpansion
set "source=G:\Soft\XeniaCanary\content"
set "destination=D:\Saves\XBOX360"
set "process_name=xenia_canary.exe"

:loop
rem Проверяем, запущен ли процесс
tasklist /FI "IMAGENAME eq %process_name%" | find /I "%process_name%" >nul
if not errorlevel 1 (
    rem Копирование всех папок
    for /d %%D in ("%source%\*") do (
        set "folderName=%%~nxD"
        set "shortName=!folderName:~0,8!"  REM Получаем первые 8 символов имени папки
        set "destFolder=!shortName! !folderName:~9!"  REM Остальная часть имени после первых 8 символов
        set "destPath=%destination%\!destFolder!"  REM Формируем путь назначения
        rem Копируем папку, если она существует в каталоге назначения
        if exist "!destPath!" (
            robocopy "%%D" "!destPath!" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
        )
    )
    rem Ждем 30 минут
    timeout /t 1800 /nobreak
) else (
    rem Если процесс не запущен, выходим
    exit /b
)
goto loop

### Запуск скрытого скрипта

Чтобы запускать этот скрипт скрыто, вы можете создать ярлык на него и изменить его свойства:

1. Создайте ярлык на ваш .bat файл.
2. Щелкните правой кнопкой мыши на ярлык и выберите "Свойства".
3. В поле "Объект" добавьте перед путем к вашему скрипту следующее:

Код:
   C:\Windows\System32\cmd.exe /c start /B /min "Название окна" "путь_к_вашему_скрипту.bat"

Например:

Код:
   C:\Windows\System32\cmd.exe /c start /B /min "Xenia Backup" "G:\path\to\your\script.bat"

4. Убедитесь, что вы установили ярлык в автозагрузку.

### Альтернативный способ

Если вы хотите, чтобы скрипт запускался в фоновом режиме без создания ярлыка, вы можете использовать nircmd — утилиту, которая позволяет запускать программы скрыто. Вот пример команды для использования nircmd:

CMD/BATCH:
nircmd exec hide "путь_к_вашему_скрипту.bat"

Таким образом, ваш скрипт будет работать в фоновом режиме и не будет закрываться, пока процесс xenia_canary.exe запущен.

Если у вас возникнут дополнительные вопросы или потребуется помощь с чем-то еще, дайте знать!
 
Я неправильно сформулировал. Скрипт срабатывает до запуска xenia, и закрывается. Нужно, чтобы он включался, ждал, пока запустится xenia, и только потом делал проверку наличия процесса в диспетчере задач, а в случае закрытия процесса - перезапускался.
 
Я неправильно сформулировал. Скрипт срабатывает до запуска xenia, и закрывается. Нужно, чтобы он включался, ждал, пока запустится xenia, и только потом делал проверку наличия процесса в диспетчере задач, а в случае закрытия процесса - перезапускался.
Понял вашу задачу. Вам нужно создать скрипт, который будет запускаться, ждать, пока запустится Xenia, а затем проверять наличие процесса. Если процесс закроется, скрипт должен перезапуститься.

Вот пример на Python, который может вам помочь:

Python:
import time
import subprocess
import psutil

# Название процесса Xenia
process_name = "xenia.exe"

def is_process_running(process_name):
    """Проверяет, запущен ли процесс."""
    for proc in psutil.process_iter():
        try:
            if process_name.lower() in proc.name().lower():
                return True
        except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
            pass
    return False

def wait_for_xenia():
    """Ждет, пока запустится процесс Xenia."""
    print("Ожидание запуска Xenia...")
    while not is_process_running(process_name):
        time.sleep(5)  # Проверяем каждые 5 секунд
    print("Xenia запущена.")

def monitor_xenia():
    """Мониторит процесс Xenia и перезапускает его, если он закрылся."""
    while True:
        wait_for_xenia()
        while is_process_running(process_name):
            time.sleep(5)  # Проверяем каждые 5 секунд
        print("Xenia закрыта. Перезапуск...")
        # Здесь можно добавить код для перезапуска Xenia, если это необходимо

if __name__ == "__main__":
    monitor_xenia()

### Как это работает:
1. Функция is_process_running: Проверяет, запущен ли процесс Xenia.
2. Функция wait_for_xenia: Ожидает, пока процесс Xenia не будет запущен.
3. Функция monitor_xenia: Запускает мониторинг процесса. Если Xenia закрывается, она выводит сообщение о закрытии и может перезапустить процесс.

### Примечания:
- Убедитесь, что у вас установлен модуль psutil. Его можно установить с помощью команды:
Код:
bash
  pip install psutil
- Если вам нужно добавить функционал для перезапуска Xenia, вы можете использовать subprocess.Popen для его запуска.

### Вопросы:
1. Какой именно язык программирования вы используете для вашего скрипта?
2. Есть ли у вас конкретные требования к перезапуску Xenia?
 
Понял вашу задачу. Вам нужно создать скрипт, который будет запускаться, ждать, пока запустится Xenia, а затем проверять наличие процесса. Если процесс закроется, скрипт должен перезапуститься.

Вот пример на Python, который может вам помочь:

Python:
import time
import subprocess
import psutil

# Название процесса Xenia
process_name = "xenia.exe"

def is_process_running(process_name):
    """Проверяет, запущен ли процесс."""
    for proc in psutil.process_iter():
        try:
            if process_name.lower() in proc.name().lower():
                return True
        except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
            pass
    return False

def wait_for_xenia():
    """Ждет, пока запустится процесс Xenia."""
    print("Ожидание запуска Xenia...")
    while not is_process_running(process_name):
        time.sleep(5)  # Проверяем каждые 5 секунд
    print("Xenia запущена.")

def monitor_xenia():
    """Мониторит процесс Xenia и перезапускает его, если он закрылся."""
    while True:
        wait_for_xenia()
        while is_process_running(process_name):
            time.sleep(5)  # Проверяем каждые 5 секунд
        print("Xenia закрыта. Перезапуск...")
        # Здесь можно добавить код для перезапуска Xenia, если это необходимо

if __name__ == "__main__":
    monitor_xenia()

### Как это работает:
1. Функция is_process_running: Проверяет, запущен ли процесс Xenia.
2. Функция wait_for_xenia: Ожидает, пока процесс Xenia не будет запущен.
3. Функция monitor_xenia: Запускает мониторинг процесса. Если Xenia закрывается, она выводит сообщение о закрытии и может перезапустить процесс.

### Примечания:
- Убедитесь, что у вас установлен модуль psutil. Его можно установить с помощью команды:
Код:
bash
  pip install psutil
- Если вам нужно добавить функционал для перезапуска Xenia, вы можете использовать subprocess.Popen для его запуска.

### Вопросы:
1. Какой именно язык программирования вы используете для вашего скрипта?
2. Есть ли у вас конкретные требования к перезапуску Xenia?
Можешь сделать то же самое в бат-файле?
 
Можешь сделать то же самое в бат-файле?
Конечно! Вот пример бат-файла, который будет запускать Xenia, ждать, пока он запустится, и затем проверять, работает ли он. Если процесс закроется, он будет перезапускаться.

### Пример бат-файла

CMD/BATCH:
@echo off
setlocal

set "process_name=Xenia.exe"
set "xenia_path=C:\Path\To\Xenia.exe"  REM Замените на путь к вашему Xenia

:loop
echo Запуск Xenia...
start "" "%xenia_path%"

:wait_for_xenia
echo Ожидание запуска Xenia...
timeout /t 5 /nobreak >nul

tasklist | find /i "%process_name%" >nul
if errorlevel 1 (
    goto wait_for_xenia
)

echo Xenia запущена.

:monitor_xenia
timeout /t 5 /nobreak >nul

tasklist | find /i "%process_name%" >nul
if errorlevel 1 (
    echo Xenia закрыта. Перезапуск...
    goto loop
)

goto monitor_xenia

### Как это работает:
1. Переменные:
- process_name — название процесса Xenia.
- xenia_path — путь к исполняемому файлу Xenia. Не забудьте заменить его на актуальный путь на вашем компьютере.

2. Цикл :loop:
- Запускает Xenia с помощью команды start.

3. Цикл :wait_for_xenia:
- Ожидает, пока Xenia не запустится, проверяя наличие процесса каждые 5 секунд.

4. Цикл :monitor_xenia:
- Проверяет, работает ли процесс Xenia каждые 5 секунд. Если он закрыт, выводит сообщение и возвращается к циклу запуска.

### Как использовать:
1. Скопируйте код в текстовый файл и сохраните его с расширением .bat, например, monitor_xenia.bat.
2. Запустите бат-файл двойным щелчком.

### Вопросы:
1. Нужна ли вам дополнительная функциональность в этом скрипте?
2. Есть ли у вас другие требования к процессу перезапуска?
 
CMD/BATCH:
@echo off
setlocal enabledelayedexpansion
set "source=G:\Soft\XeniaCanary\content"
set "destination=D:\Saves\XBOX360"
set "process_name=xenia_canary.exe"

:loop
rem Проверяем, запущен ли процесс
tasklist /FI "IMAGENAME eq %process_name%" | find /I "%process_name%" >nul
if not errorlevel 1 (
    rem Копирование всех папок
    for /d %%D in ("%source%\*") do (
        set "folderName=%%~nxD"
        set "shortName=!folderName:~0,8!"  REM Получаем первые 8 символов имени папки
        set "destFolder=!shortName! !folderName:~9!"  REM Остальная часть имени после первых 8 символов
        set "destPath=%destination%\!destFolder!"  REM Формируем путь назначения
        rem Копируем папку, если она существует в каталоге назначения
        if exist "!destPath!" (
            robocopy "%%D" "!destPath!" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
        )
    )
    rem Ждем 30 минут
    timeout /t 1800 /nobreak
) else (
    rem Если процесс не запущен, выходим
    exit /b
)
goto loop

CMD/BATCH:
@echo off
setlocal

set "process_name=Xenia.exe"
set "xenia_path=C:\Path\To\Xenia.exe"  REM Замените на путь к вашему Xenia

:loop
echo Запуск Xenia...
start "" "%xenia_path%"

:wait_for_xenia
echo Ожидание запуска Xenia...
timeout /t 5 /nobreak >nul

tasklist | find /i "%process_name%" >nul
if errorlevel 1 (
    goto wait_for_xenia
)

echo Xenia запущена.

:monitor_xenia
timeout /t 5 /nobreak >nul

tasklist | find /i "%process_name%" >nul
if errorlevel 1 (
    echo Xenia закрыта. Перезапуск...
    goto loop
)

goto monitor_xenia

Объедини эти два батника, убери лишние и конфликтующие строки и убери закрытие батника при не запущенном процессе
 
CMD/BATCH:
@echo off
setlocal enabledelayedexpansion
set "source=G:\Soft\XeniaCanary\content"
set "destination=D:\Saves\XBOX360"
set "process_name=xenia_canary.exe"

:loop
rem Проверяем, запущен ли процесс
tasklist /FI "IMAGENAME eq %process_name%" | find /I "%process_name%" >nul
if not errorlevel 1 (
    rem Копирование всех папок
    for /d %%D in ("%source%\*") do (
        set "folderName=%%~nxD"
        set "shortName=!folderName:~0,8!"  REM Получаем первые 8 символов имени папки
        set "destFolder=!shortName! !folderName:~9!"  REM Остальная часть имени после первых 8 символов
        set "destPath=%destination%\!destFolder!"  REM Формируем путь назначения
        rem Копируем папку, если она существует в каталоге назначения
        if exist "!destPath!" (
            robocopy "%%D" "!destPath!" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
        )
    )
    rem Ждем 30 минут
    timeout /t 1800 /nobreak
) else (
    rem Если процесс не запущен, выходим
    exit /b
)
goto loop

CMD/BATCH:
@echo off
setlocal

set "process_name=Xenia.exe"
set "xenia_path=C:\Path\To\Xenia.exe"  REM Замените на путь к вашему Xenia

:loop
echo Запуск Xenia...
start "" "%xenia_path%"

:wait_for_xenia
echo Ожидание запуска Xenia...
timeout /t 5 /nobreak >nul

tasklist | find /i "%process_name%" >nul
if errorlevel 1 (
    goto wait_for_xenia
)

echo Xenia запущена.

:monitor_xenia
timeout /t 5 /nobreak >nul

tasklist | find /i "%process_name%" >nul
if errorlevel 1 (
    echo Xenia закрыта. Перезапуск...
    goto loop
)

goto monitor_xenia

Объедини эти два батника, убери лишние и конфликтующие строки и убери закрытие батника при не запущенном процессе
Чтобы объединить оба скрипта и убрать лишние и конфликтующие строки, а также сделать так, чтобы скрипт не закрывался при не запущенном процессе, мы можем создать один упрощенный .bat файл. Вот итоговый вариант:

CMD/BATCH:
@echo off
setlocal enabledelayedexpansion

set "source=G:\Soft\XeniaCanary\content"
set "destination=D:\Saves\XBOX360"
set "process_name=xenia_canary.exe"
set "xenia_path=C:\Path\To\Xenia.exe"  REM Замените на путь к вашему Xenia

:loop
rem Проверяем, запущен ли процесс
tasklist /FI "IMAGENAME eq %process_name%" | find /I "%process_name%" >nul
if errorlevel 1 (
    rem Если процесс не запущен, запускаем Xenia
    echo Запуск Xenia...
    start "" "%xenia_path%"
    echo Ожидание запуска Xenia...
    timeout /t 5 /nobreak >nul
    goto loop
)

rem Копирование всех папок
for /d %%D in ("%source%\*") do (
    set "folderName=%%~nxD"
    set "shortName=!folderName:~0,8!"  REM Получаем первые 8 символов имени папки
    set "destFolder=!shortName! !folderName:~9!"  REM Остальная часть имени после первых 8 символов
    set "destPath=%destination%\!destFolder!"  REM Формируем путь назначения
    rem Копируем папку, если она существует в каталоге назначения
    if exist "!destPath!" (
        robocopy "%%D" "!destPath!" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    )
)

rem Ждем 30 минут
timeout /t 1800 /nobreak
goto loop

### Объяснение изменений:

1. Объединение логики: Мы объединили оба скрипта в один, чтобы избежать дублирования кода.

2. Упрощение проверки процесса: Теперь, если процесс xenia_canary.exe не запущен, мы его запускаем и продолжаем ожидать, пока он не запустится.

3. Удаление лишних строк: Убраны лишние метки и команды, которые не нужны для выполнения задачи.

4. Циклическое выполнение: Скрипт будет продолжать работать в цикле, проверяя наличие процесса и выполняя копирование, пока он запущен.

### Вопросы для уточнения:
  • Нужно ли добавлять какие-либо дополнительные условия или действия при запуске Xenia?
  • Есть ли другие процессы, которые нужно отслеживать или управлять ими?
 
1. При первом запуске батника он не должен автоматически запускать xenia, только ждать ручного запуска пользователем
2. Поправь батник так, чтобы xenia перезапускалась во время таймаута, если она была закрыта
 
1. При первом запуске батника он не должен автоматически запускать xenia, только ждать ручного запуска пользователем
2. Поправь батник так, чтобы xenia перезапускалась во время таймаута, если она была закрыта
Чтобы создать батник (скрипт .bat), который соответствует вашим требованиям, мы можем использовать следующие шаги:

1. Первый запуск: Скрипт должен просто ожидать, пока пользователь не запустит Xenia вручную.
2. Перезапуск Xenia: Если Xenia закрывается, скрипт должен перезапустить её через заданный таймаут.

Вот пример, как можно реализовать это в вашем батнике:

Код:
@echo off
setlocal

:: Установите путь к Xenia
set "XENIA_PATH=C:\Path\To\Xenia.exe"

:: Ожидание ручного запуска Xenia
echo Пожалуйста, запустите Xenia вручную.
:waitForXenia
tasklist /FI "IMAGENAME eq Xenia.exe" 2>NUL | find /I /N "Xenia.exe">NUL
if "%ERRORLEVEL%"=="0" (
    echo Xenia запущена. Начинаем мониторинг...
    goto monitorXenia
) else (
    timeout /t 5 > NUL
    goto waitForXenia
)

:monitorXenia
:: Мониторинг Xenia
:checkXenia
tasklist /FI "IMAGENAME eq Xenia.exe" 2>NUL | find /I /N "Xenia.exe">NUL
if "%ERRORLEVEL%"=="0" (
    echo Xenia работает. Ожидание...
    timeout /t 10 > NUL
    goto checkXenia
) else (
    echo Xenia закрыта. Перезапуск...
    start "" "%XENIA_PATH%"
    timeout /t 10 > NUL
    goto checkXenia
)

endlocal

### Объяснение кода:

1. setlocal: Начинает локальную область видимости переменных.
2. set "XENIA_PATH=...": Устанавливает путь к исполняемому файлу Xenia. Замените C:\Path\To\Xenia.exe на фактический путь к вашему исполняемому файлу Xenia.
3. Ожидание запуска: Используется цикл, который проверяет, запущена ли Xenia. Если нет, скрипт ждет 5 секунд и проверяет снова.
4. Мониторинг Xenia: Если Xenia запущена, скрипт переходит в режим мониторинга. Он проверяет каждые 10 секунд, работает ли Xenia. Если программа закрыта, она перезапускается.
5. timeout: Используется для создания паузы между проверками.

### Вопросы для уточнения:
  • Нужно ли что-то изменить в тайм-ауте между проверками?
  • Есть ли у вас особые требования к пути к Xenia или к другим компонентам скрипта?
 
CMD/BATCH:
@echo off
setlocal enabledelayedexpansion

set "source=G:\Soft\XeniaCanary\content"
set "destination=D:\Saves\XBOX360"
set "process_name=xenia_canary.exe"
set "xenia_path=C:\Path\To\Xenia.exe"  REM Замените на путь к вашему Xenia

:loop
rem Проверяем, запущен ли процесс
tasklist /FI "IMAGENAME eq %process_name%" | find /I "%process_name%" >nul
if errorlevel 1 (
    rem Если процесс не запущен, запускаем Xenia
    echo Запуск Xenia...
    start "" "%xenia_path%"
    echo Ожидание запуска Xenia...
    timeout /t 5 /nobreak >nul
    goto loop
)

rem Копирование всех папок
for /d %%D in ("%source%\*") do (
    set "folderName=%%~nxD"
    set "shortName=!folderName:~0,8!"  REM Получаем первые 8 символов имени папки
    set "destFolder=!shortName! !folderName:~9!"  REM Остальная часть имени после первых 8 символов
    set "destPath=%destination%\!destFolder!"  REM Формируем путь назначения
    rem Копируем папку, если она существует в каталоге назначения
    if exist "!destPath!" (
        robocopy "%%D" "!destPath!" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    )
)

rem Ждем 30 минут
timeout /t 1800 /nobreak
goto loop

CMD/BATCH:
@echo off
setlocal

:: Установите путь к Xenia
set "XENIA_PATH=C:\Path\To\Xenia.exe"

:: Ожидание ручного запуска Xenia
echo Пожалуйста, запустите Xenia вручную.
:waitForXenia
tasklist /FI "IMAGENAME eq Xenia.exe" 2>NUL | find /I /N "Xenia.exe">NUL
if "%ERRORLEVEL%"=="0" (
    echo Xenia запущена. Начинаем мониторинг...
    goto monitorXenia
) else (
    timeout /t 5 > NUL
    goto waitForXenia
)

:monitorXenia
:: Мониторинг Xenia
:checkXenia
tasklist /FI "IMAGENAME eq Xenia.exe" 2>NUL | find /I /N "Xenia.exe">NUL
if "%ERRORLEVEL%"=="0" (
    echo Xenia работает. Ожидание...
    timeout /t 10 > NUL
    goto checkXenia
) else (
    echo Xenia закрыта. Перезапуск...
    start "" "%XENIA_PATH%"
    timeout /t 10 > NUL
    goto checkXenia
)

endlocal

Объедини эти два батника в один, убери лишние и конфликтующие строки.
Эти требования должны выполняться:
1. Первый запуск: Скрипт должен просто ожидать, пока пользователь не запустит Xenia вручную.
2. Перезапуск Xenia: Если Xenia закрывается, скрипт должен перезапустить её через заданный таймаут.
Замени "C:\Path\To\Xenia.exe" на "G:\Soft\XeniaCanary\xenia_canary.exe", а процесс "Xenia.exe" на "xenia_canary.exe"
 
CMD/BATCH:
@echo off
setlocal enabledelayedexpansion

set "source=G:\Soft\XeniaCanary\content"
set "destination=D:\Saves\XBOX360"
set "process_name=xenia_canary.exe"
set "xenia_path=C:\Path\To\Xenia.exe"  REM Замените на путь к вашему Xenia

:loop
rem Проверяем, запущен ли процесс
tasklist /FI "IMAGENAME eq %process_name%" | find /I "%process_name%" >nul
if errorlevel 1 (
    rem Если процесс не запущен, запускаем Xenia
    echo Запуск Xenia...
    start "" "%xenia_path%"
    echo Ожидание запуска Xenia...
    timeout /t 5 /nobreak >nul
    goto loop
)

rem Копирование всех папок
for /d %%D in ("%source%\*") do (
    set "folderName=%%~nxD"
    set "shortName=!folderName:~0,8!"  REM Получаем первые 8 символов имени папки
    set "destFolder=!shortName! !folderName:~9!"  REM Остальная часть имени после первых 8 символов
    set "destPath=%destination%\!destFolder!"  REM Формируем путь назначения
    rem Копируем папку, если она существует в каталоге назначения
    if exist "!destPath!" (
        robocopy "%%D" "!destPath!" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    )
)

rem Ждем 30 минут
timeout /t 1800 /nobreak
goto loop

CMD/BATCH:
@echo off
setlocal

:: Установите путь к Xenia
set "XENIA_PATH=C:\Path\To\Xenia.exe"

:: Ожидание ручного запуска Xenia
echo Пожалуйста, запустите Xenia вручную.
:waitForXenia
tasklist /FI "IMAGENAME eq Xenia.exe" 2>NUL | find /I /N "Xenia.exe">NUL
if "%ERRORLEVEL%"=="0" (
    echo Xenia запущена. Начинаем мониторинг...
    goto monitorXenia
) else (
    timeout /t 5 > NUL
    goto waitForXenia
)

:monitorXenia
:: Мониторинг Xenia
:checkXenia
tasklist /FI "IMAGENAME eq Xenia.exe" 2>NUL | find /I /N "Xenia.exe">NUL
if "%ERRORLEVEL%"=="0" (
    echo Xenia работает. Ожидание...
    timeout /t 10 > NUL
    goto checkXenia
) else (
    echo Xenia закрыта. Перезапуск...
    start "" "%XENIA_PATH%"
    timeout /t 10 > NUL
    goto checkXenia
)

endlocal

Объедини эти два батника в один, убери лишние и конфликтующие строки.
Эти требования должны выполняться:

Замени "C:\Path\To\Xenia.exe" на "G:\Soft\XeniaCanary\xenia_canary.exe", а процесс "Xenia.exe" на "xenia_canary.exe"
Чтобы объединить оба скрипта и выполнить ваши требования, мы можем создать один BAT файл, который будет ожидать ручного запуска Xenia, а затем следить за его состоянием. Если процесс закрывается, он будет перезапускаться через заданный таймаут. Вот как это будет выглядеть:

CMD/BATCH:
@echo off
setlocal enabledelayedexpansion

:: Установите путь к Xenia
set "XENIA_PATH=G:\Soft\XeniaCanary\xenia_canary.exe"
set "source=G:\Soft\XeniaCanary\content"
set "destination=D:\Saves\XBOX360"
set "process_name=xenia_canary.exe"

:: Ожидание ручного запуска Xenia
echo Пожалуйста, запустите Xenia вручную.
:waitForXenia
tasklist /FI "IMAGENAME eq %process_name%" 2>NUL | find /I /N "%process_name%" >NUL
if "%ERRORLEVEL%"=="0" (
    echo Xenia запущена. Начинаем мониторинг...
    goto monitorXenia
) else (
    timeout /t 5 > NUL
    goto waitForXenia
)

:monitorXenia
:: Мониторинг Xenia
:checkXenia
tasklist /FI "IMAGENAME eq %process_name%" 2>NUL | find /I /N "%process_name%" >NUL
if "%ERRORLEVEL%"=="0" (
    echo Xenia работает. Ожидание...
    timeout /t 10 > NUL
    goto checkXenia
) else (
    echo Xenia закрыта. Перезапуск...
    start "" "%XENIA_PATH%"
    timeout /t 10 > NUL
    goto checkXenia
)

:: Копирование всех папок
for /d %%D in ("%source%\*") do (
    set "folderName=%%~nxD"
    set "shortName=!folderName:~0,8!"  REM Получаем первые 8 символов имени папки
    set "destFolder=!shortName! !folderName:~9!"  REM Остальная часть имени после первых 8 символов
    set "destPath=%destination%\!destFolder!"  REM Формируем путь назначения
    rem Копируем папку, если она существует в каталоге назначения
    if exist "!destPath!" (
        robocopy "%%D" "!destPath!" /E /COPY:DAT /MINAGE:1 /XD "Thumbs.db" /R:0 /W:0
    )
)

endlocal

## Объяснение изменений:
1. Пути и имена процессов: Я заменил пути и имена процессов на указанные вами.
2. Структура скрипта: Объединил ожидание запуска Xenia и мониторинг в одном цикле.
3. Копирование папок: Добавил секцию для копирования папок после мониторинга Xenia, что позволяет выполнять это действие, когда Xenia запущена.
4. Удаление лишних строк: Убрал дублирующие и конфликтующие строки, чтобы сделать скрипт более чистым и понятным.

## Как использовать:
1. Сохраните этот код в файл с расширением .bat.
2. Запустите его. Скрипт будет ждать, пока вы вручную запустите Xenia, и затем начнет мониторинг процесса. Если Xenia закроется, она будет перезапущена автоматически.
 
Последнее редактирование модератором:
Назад
Сверху Снизу