UsandoFORFILES

UsandoFORFILES

Hola chicos, actualmente estoy trabajando en una escuela y he creado un script para escanear todas las carpetas de los estudiantes en busca de tipos de archivos específicos. Me preguntaba si había alguna manera de hacer una copia del tipo de archivo específico antes de eliminarlo. No se me ocurrió una manera de hacerlo ya que tanto xcopy como robocopy requieren una dirección de origen dentro de la sintaxis. Aquí está mi guión

@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

¿Supongo que no es tan fácil (y mucho menos posible) como ingresar algo como lo siguiente?

xcopy *.bat Y:\

Por cierto, los scripts de PowerShell no están a mi disposición porque no tengo derechos para ejecutarlos (tonto departamento de educación), pero si hay una alternativa de PowerShell, publíquela también, ya que sería bueno para mí aprender.

Respuesta1

UsandoFORFILES

De esta manera podría ser aún más fácil de digerir:

forfiles /P C:\Windows /S /M *.dll /C "cmd /c @echo @path"

Este es un ejemplo que puedes ejecutar desde la línea de comando sin dañar nada.

Así es como puedes usarlo en tu script:

forfiles /P X:\ /S /M *.bat /C "cmd /c @copy @path Y:\"

UsandoFOR

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
)

Cómo funciona esto:

El FORcomando con el /Rmodificador busca recursivamente a través del directorio proporcionado (en este caso, X:\el patrón definido en la INsección. Aquí le estamos dando el patrón *.bat. Para cada archivo encontrado, ejecuta la declaración después de DO. El archivo que se encuentre será poner en la %%Bvariable (puedes elegir cualquier letra).

Al usar (...)después de, DOpermitimos ejecutar múltiples comandos en cada iteración del bucle.

%%~fBes una forma especial de tratar el valor de %%B. Comienza ~con todos estos formateadores especiales y por sí solo elimina las comillas, si existen. fformatea el valor como un nombre de ruta completo, en caso de que se utilice como relativo.

La ejecución for /?en la línea de comando brinda una descripción muy detallada de FORlas capacidades de y los indicadores de formato que se pueden usar.

Nota

Estamos usando %%Ben lugar de %Bcomo le mostraría la ayuda porque está dentro de un archivo por lotes. Aquí hay algunos ejemplos FORque puede ejecutar directamente en la línea de comando:

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

Si estuvieran en un archivo por lotes, necesitaría usar signos de doble porcentaje.

Acerca de PowerShell

También quería señalar que no se necesitan permisos especiales para ejecutar scripts de PowerShell.

Si recibe un error sobre la política de ejecución, esto es solo una medida de seguridad y dentro de PowerShell (no en el script) puede ejecutar:

Set-ExecutionPolicy Bypass

Deberías leer mássobre la política de ejecuciónpara obtener una comprensión completa de las posibles configuraciones.

Si está ejecutando un script de PowerShell a través de una tarea programada, puede cambiar la política de ejecución cuando lo invoque, de esta manera:

powershell.exe -ExecutionPolicy Bypass

Una invocación completa desde una tarea programada podría verse así:

powershell.exe -NoProfile -NonInteractive -NoLogo -ExecutionPolicy Bypass -File C:\Scripts\script.ps1

Respuesta2

Utilice FORbucles:

SETLOCAL EnableExtensions
For /R "X:\" %%I IN (*.bat) do (
    xcopy /i "%%I" "Y:\%%~nxI"
    del "%%I"
)

Entonces tu script podría ser:

@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

información relacionada