
Привет, ребята, я сейчас работаю в школе и создал скрипт для сканирования всех папок учеников на предмет определенных типов файлов. Мне интересно, есть ли способ сделать копию определенного типа файла перед его удалением? Я не могу придумать, как это сделать, так как и xcopy, и robocopy требуют исходный адрес в синтаксисе. Вот мой скрипт
@echo off
net use X: \\LOCATION FOR STUDENT FOLDERS
net use Y: \\LOCATION FOR COPIED FILES
net use Z: \\LOCATION FOR .TXT FILE OF DELETED FILES
X:
cls
Echo Deleting bat files please wait...
del /s *.bat > Z:\DeletedFiles.txt 2>&1
Echo Deleting CMD files please wait...
del /s *.cmd >> Z:\DeletedFiles.txt 2>&1
Echo Deleting VBS files please wait...
del /s *.vbs >> Z:\DeletedFiles.txt 2>&1
Echo Deleting Executable files please wait...
del /s *.exe >> Z:\DeletedFiles.txt 2>&1
mountvol X:\ /D
mountvol Y:\ /D
mountvol Z:\ /D
cls
Echo Process Completed. Drives Unmounted
set /p=Press Any Key To Close
Я предполагаю, что это не так просто (и тем более невозможно), как ввести что-то вроде этого?
xcopy *.bat Y:\
Кстати, скриптов PowerShell у меня нет, так как у меня нет прав на их запуск (глупый отдел образования), но если есть альтернатива PowerShell, пожалуйста, напишите и о ней, мне будет полезно ее изучить.
решение1
С использованиемFORFILES
Этот способ может быть даже более простым для восприятия:
forfiles /P C:\Windows /S /M *.dll /C "cmd /c @echo @path"
Это пример, который можно запустить из командной строки, не навредив ничему.
Вот как вы можете использовать это в своем сценарии:
forfiles /P X:\ /S /M *.bat /C "cmd /c @copy @path Y:\"
С использованиемFOR
FOR /R X:\ %%B IN (*.bat) DO (
copy "%%~fB" Y:\
REM you could do the delete in here too,
REM but it's probably faster the way you have it
)
Как это работает:
Команда FOR
с /R
переключателем рекурсивно просматривает предоставленный каталог (в данном случае X:\
на предмет шаблона, определенного в IN
разделе. Здесь мы задаем ему шаблон ) *.bat
. Для каждого найденного файла он выполняет оператор после DO
. Найденный файл будет помещен в %%B
переменную (можно выбрать любую букву).
Используя (...)
после DO
мы позволяем запускать несколько команд на каждой итерации цикла.
%%~fB
— это особый способ обработки значения %%B
. ~
Начинает все такие специальные форматировщики и сам удаляет кавычки, если они есть. f
форматирует значение как полное имя пути, в случае, если оно используется как относительное.
Запуск for /?
в командной строке дает очень подробный отчет о FOR
возможностях и флагах форматирования, которые можно использовать.
Примечание
Мы используем %%B
вместо %B
того, как вам покажет справка, потому что это внутри пакетного файла. Вот несколько примеров того, FOR
что вы можете запустить прямо в командной строке:
FOR /R C:\Windows %Q IN (*.ttf) DO @echo I am a font: "%Q"
FOR /R C:\Windows %Q IN (*.dll) DO @echo Full path to DLL: %~fQ
Если бы они были в пакетном файле, вам пришлось бы использовать двойной знак процента.
О PowerShell
Я также хотел бы отметить, что для запуска скриптов PowerShell не требуются какие-либо специальные разрешения.
Если вы получаете сообщение об ошибке политики выполнения, это всего лишь мера безопасности, и в PowerShell (не в скрипте) вы можете выполнить:
Set-ExecutionPolicy Bypass
Вам следует прочитать большео политике исполнениячтобы получить полное представление о возможных настройках.
Если вы запускаете скрипт PowerShell через запланированную задачу, вы можете изменить политику выполнения при его вызове, например так:
powershell.exe -ExecutionPolicy Bypass
Полный вызов из запланированной задачи может выглядеть так:
powershell.exe -NoProfile -NonInteractive -NoLogo -ExecutionPolicy Bypass -File C:\Scripts\script.ps1
решение2
Используйте FOR
циклы:
SETLOCAL EnableExtensions
For /R "X:\" %%I IN (*.bat) do (
xcopy /i "%%I" "Y:\%%~nxI"
del "%%I"
)
Итак, ваш сценарий может быть таким:
@echo off
SETLOCAL EnableExtensions
net use X: \\LOCATION FOR STUDENT FOLDERS
net use Y: \\LOCATION FOR COPIED FILES
net use Z: \\LOCATION FOR .TXT FILE OF DELETED FILES
X:
cls
Echo Deleting bat, cmd, vbs, and exe files please wait...
For /R "X:\" %%I IN (*.*) do (
set "isTrue="
if (%%~xI == ".bat") set isTrue=1
if (%%~xI == ".cmd") set isTrue=1
if (%%~xI == ".vbs") set isTrue=1
if (%%~xI == ".exe") set isTrue=1
if defined isTrue (
xcopy "%%I" "Y:\%%~nxI"
del /s "%%I" > "Z:\DeletedFiles.txt" 2>&1
)
)
mountvol X:\ /D
mountvol Y:\ /D
mountvol Z:\ /D
cls
Echo Process Completed. Drives Unmounted
set /p=Press Any Key To Close