С использованиемFORFILES

С использованиемFORFILES

Привет, ребята, я сейчас работаю в школе и создал скрипт для сканирования всех папок учеников на предмет определенных типов файлов. Мне интересно, есть ли способ сделать копию определенного типа файла перед его удалением? Я не могу придумать, как это сделать, так как и 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

Связанный контент