
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 FOR
comando con el /R
modificador busca recursivamente a través del directorio proporcionado (en este caso, X:\
el patrón definido en la IN
secció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 %%B
variable (puedes elegir cualquier letra).
Al usar (...)
después de, DO
permitimos ejecutar múltiples comandos en cada iteración del bucle.
%%~fB
es una forma especial de tratar el valor de %%B
. Comienza ~
con todos estos formateadores especiales y por sí solo elimina las comillas, si existen. f
formatea 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 FOR
las capacidades de y los indicadores de formato que se pueden usar.
Nota
Estamos usando %%B
en lugar de %B
como le mostraría la ayuda porque está dentro de un archivo por lotes. Aquí hay algunos ejemplos FOR
que 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 FOR
bucles:
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