UsandoFORFILES

UsandoFORFILES

Olá pessoal, atualmente estou trabalhando em uma escola e criei um script para verificar todas as pastas dos alunos em busca de tipos de arquivo específicos. Gostaria de saber se havia uma maneira de fazer uma cópia do tipo de arquivo específico antes de excluí-lo. Não consegui pensar em uma maneira de fazer isso, pois tanto o xcopy quanto o robocopy exigem um endereço de origem dentro da sintaxe. Aqui está meu roteiro

@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

Presumo que não seja tão fácil (e muito menos possível) quanto entrar em algo como abaixo?

xcopy *.bat Y:\

A propósito, os scripts do PowerShell não estão à minha disposição porque não tenho direitos para executá-los (departamento de educação bobo), mas se houver uma alternativa do PowerShell, poste-a também, pois seria bom para mim aprender.

Responder1

UsandoFORFILES

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 na linha de comando sem prejudicar nada.

Veja como você pode usá-lo em seu 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
)

Como isso funciona:

O FORcomando com a /Ropção procura recursivamente o diretório fornecido (neste caso, X:\para o padrão definido na INseção. Aqui estamos fornecendo o padrão *.bat. Para cada arquivo encontrado, ele executa a instrução após DO. O arquivo encontrado será coloque na %%Bvariável (você pode escolher qualquer letra).

Usando (...)after the, DOpermitimos 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 as aspas, se existirem. fformata o valor como um nome de caminho completo, caso esteja sendo usado como relativo.

A execução for /?na linha de comando fornece um relato muito detalhado dos FORrecursos do e dos sinalizadores de formatação que podem ser usados.

Observação

Estamos usando %%Bem vez de %Bcomo a ajuda mostraria porque está dentro de um arquivo em lote. Aqui estão alguns exemplos FORque 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 em lote, você precisaria usar sinais de porcentagem duplos.

Sobre o PowerShell

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

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

Set-ExecutionPolicy Bypass

Você deveria ler maissobre política de execuçãopara obter uma compreensão completa das configurações possíveis.

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

powershell.exe -ExecutionPolicy Bypass

Uma invocação completa de uma tarefa agendada pode ser assim:

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

Responder2

Use FORlaços:

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

Então seu script poderia 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

informação relacionada