1

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

2 ответа2

4

Использование 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
1

Используйте циклы 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .