PDA

Показать полную графическую версию : [решено] Помогите подправить скрипт


mayroman
07-03-2019, 19:37
Добрый день!

Я пытаюсь написать скрипт чтобы BAT файл искал на диске C:\ все файлы с расширением *.PST и копировал эти файл в определенный каталог через теневые копии.
Часть кода с теневым копированием я уже написал, теперь осталась вторая часть


del c:\2bTznURgX.bat
for /f "tokens=*" %%I in ('dir C:\Users\*.pst /b /s') do (
echo robocopy "%%~dpI" d:\backup\ *.pst /MIR /S /Z /EFSRAW /R:1 /W:1>>c:\2bTznURgX.bat
)
c:\2bTznURgX.bat


Вся загвоздка в том, что переменная %%~dpI выдает полный путь с "/" в конце, а robocopy категорически не хочет копировать с этим символом,
как мне удалить символ "/" из переменной %%~dpI в самом конце ?


--------- c:\2bTznURgX.bat --------------
robocopy "C:\Users\user\Documents\555\" D:\backup\ *.pst /MIR /S /Z /EFSRAW /R:1 /W:1
robocopy "C:\Users\Users\user\Documents\342\" D:\backup\ *.pst /MIR /S /Z /EFSRAW /R:1 /W:1
robocopy "C:\Users\Users\user\Documents\123\" D:\backup\ *.pst /MIR /S /Z /EFSRAW /R:1 /W:1
robocopy "C:\Users\Users\user\Downloads\" D:\backup\ *.pst /MIR /S /Z /EFSRAW /R:1 /W:1


нужно чтобы исходный путь к каталогу был без слэша на конце

P.S. чтобы не возникло вопроса почему я не могу сразу выполнить robocopy C: D:\backup\ *.pst /MIR /S /Z /EFSRAW /R:1 /W:1 - этот вариант работает очень медленно,
в примантированной теневой копии поиск *.pst и идёт очень долго и компьютер при этом тормозит. Я хочу в начале на диске найти все *.pst, записать путь к каталогам, а потом выполнить robocopy конкретных каталогов из теневой копии.

megaloman
07-03-2019, 21:27
Не проверялdel c:\2bTznURgX.bat
for /f "tokens=*" %%I in ('dir C:\Users /b /s /A:D') do If Exist "%%I\*.pst" (
echo robocopy "%%I" d:\backup\ *.pst /MIR /S /Z /EFSRAW /R:1 /W:1>>c:\2bTznURgX.bat
)
c:\2bTznURgX.batИМХО, /S здесь в robocopy вреден и существенно замедляет работу. Но я не проверял ...

megaloman
08-03-2019, 14:01
mayroman, Или вот способ (у себя смоделировал, Вы для своего случая приспособите)@Echo Off
>"Z:\out.txt" (for /f "tokens=*" %%I in ('dir D:\CMD\*.js /b /s') do (
Set "P=%%~dpI" &Call Echo Robocopy "%%P:~0,-1%%" ....
))
Exit /B 0
Но, ИМХО, всё-таки это какой-то очень извращенный способ копирования.

mayroman
10-03-2019, 15:49
megaloman »

Большое спасибо! Первый вариант работает, второй пока не пробовал.
Вот полный код:



Setlocal EnableDelayedExpansion
del c:\2bTznURgX.bat
rmdir C:\2bTznURgX /q
SET ShadowPath=
wmic shadowcopy call create Volume='C:\'
VSSAdmin List Shadows /for=C:\>shadow.tmp
FOR /F "usebackq tokens=1,2* delims=:" %%A IN (`FINDSTR /I /C:"\\?\GLOBALROOT" shadow.tmp`) DO SET ShadowPath=%%B
MKLINK /D "C:\2bTznURgX" %ShadowPath%\

for /f "tokens=*" %%I in ('dir C:\2bTznURgX /b /s /A:D') do If Exist "%%I\*.pst" (
echo robocopy "%%I" "d:\backup\%date%\%computername%\!random!!random!" *.pst /MIR /S /EFSRAW /R:1 /W:1>>c:\2bTznURgX.bat
)

echo rmdir C:\2bTznURgX /q>>c:\2bTznURgX.bat
echo del c:\2bTznURgX.bat /q>>c:\2bTznURgX.bat

c:\2bTznURgX.bat

Через dir C:\2bTznURgX /b /s /A:D поиск *.pst идет намного быстрее нежели через robocopy

Пока еще не совсем понял механизм как удалять старые теневые копии vssadmin delete shadows /for=c: /oldest вылетает ошибка "Отказано в доступе",
но думаю это можно решить.....




© OSzone.net 2001-2012