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