Copie tipos de arquivos específicos de um local para outro

1

Oi pessoal estou atualmente trabalhando em uma escola e eu criei um script para digitalizar todas as pastas dos alunos para os tipos de arquivo sepcific, eu queria saber se havia uma maneira que eu poderia fazer uma cópia do tipo de arquivo específico antes de excluí-lo? Eu não conseguia pensar em uma maneira de fazer isso, já que o xcopy e o robocopy exigem um endereço de origem dentro da sintaxe. Aqui está o meu script

@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

Estou assumindo que não é tão fácil (quanto mais possível) entrar em algo como abaixo?

xcopy *.bat Y:\

A propósito, os scripts do powershell não estão à minha disposição, pois eu não tenho o direito de executá-los (departamento de educação boba), mas se houver uma alternativa ao PowerHay por favor poste também, pois seria bom eu aprender.

    
por Super Geoff 13.08.2014 / 03:07

2 respostas

4

Usando FORFILES

Desta forma, pode ser ainda mais fácil de digerir:

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

Este é um exemplo que você pode executar a partir da linha de comando sem ferir nada.

Veja como você pode usá-lo no seu script:

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

Usando 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
)

Como isso funciona:

O comando FOR com a opção /R aparece recursivamente no diretório fornecido (neste caso, X:\ para o padrão definido na seção IN . Aqui estamos dando o padrão *.bat . Para cada arquivo encontrado, ele executa a instrução após DO . O arquivo encontrado será colocado na variável %%B (você pode escolher qualquer letra).

Usando (...) após o DO , permitimos a execução de vários comandos em cada iteração do loop.

%%~fB é uma maneira especial de tratar o valor de %%B . O ~ inicia todos esses formatadores especiais e, por si só, remove aspas, se existirem. f formata o valor como um nome de caminho completo, caso ele esteja sendo usado como relativo.

A execução de for /? na linha de comando fornece uma conta muito detalhada das capacidades do FOR e dos sinalizadores de formatação que podem ser usados.

Nota

Estamos usando %%B em vez de %B como a ajuda mostraria porque está dentro de um arquivo em lote. Aqui estão alguns exemplos de FOR que você pode executar diretamente na linha 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

Se eles estivessem em um arquivo de lote, você precisaria usar sinais de porcentagem dupla.

Sobre o PowerShell

Eu também queria salientar que você não precisa de nenhuma permissão especial para executar scripts do PowerShell.

Se você está recebendo um erro sobre a política de execução, isso é apenas uma medida de segurança e dentro do PowerShell (não no script) você pode executar:

Set-ExecutionPolicy Bypass

Você deve ler mais sobre a política de execução para ter uma idéia completa das configurações possíveis.

Se você estiver executando um script PowerShell por meio de uma tarefa agendada, poderá alterar a política de execução quando invocá-la, desta forma:

powershell.exe -ExecutionPolicy Bypass

Uma invocação completa de uma tarefa agendada pode ter esta aparência:

powershell.exe -NoProfile -NonInteractive -NoLogo -ExecutionPolicy Bypass -File C:\Scripts\script.ps1
    
por 13.08.2014 / 04:18
1

Use FOR loops:

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

Então, o seu script pode 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
    
por 13.08.2014 / 04:11