Como faço para escrever um script em lotes do Windows para copiar o novo arquivo de um diretório?
-
01-07-2019 - |
Pergunta
Eu preciso copiar o arquivo mais recente em um diretório para um novo local. recursos até agora que eu encontrei na forfiles comando, a data relacionada com a questão aqui, e outra pergunta relacionada . Eu só estou tendo um pouco de dificuldade para colocar os pedaços juntos! Como faço para copiar o arquivo mais recente nesse diretório para um novo local?
Solução
Windows shell, um forro:
FOR /F %%I IN ('DIR *.* /B /O:-D') DO COPY %%I <<NewDir>> & EXIT
Outras dicas
A resposta aceita dá um exemplo de usar o arquivo mais recente em um comando e, em seguida, sair. Se você precisar fazer isso em um arquivo de morcego com outras operações complexas que você pode usar o seguinte para armazenar o nome do arquivo mais recente em uma variável:
FOR /F "delims=|" %%I IN ('DIR "*.*" /B /O:D') DO SET NewestFile=%%I
Agora você pode referenciar% NewestFile% em todo o resto do seu arquivo de morcego.
Por exemplo, aqui é o que usamos para obter a versão mais recente de um arquivo bak banco de dados a partir de um diretório, copie-o para um servidor, e em seguida, restaurar a db:
:Variables
SET DatabaseBackupPath=\\virtualserver1\Database Backups
echo.
echo Restore WebServer Database
FOR /F "delims=|" %%I IN ('DIR "%DatabaseBackupPath%\WebServer\*.bak" /B /O:D') DO SET NewestFile=%%I
copy "%DatabaseBackupPath%\WebServer\%NewestFile%" "D:\"
sqlcmd -U <username> -P <password> -d master -Q ^
"RESTORE DATABASE [ExampleDatabaseName] ^
FROM DISK = N'D:\%NewestFile%' ^
WITH FILE = 1, ^
MOVE N'Example_CS' TO N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Example.mdf', ^
MOVE N'Example_CS_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Example_1.LDF', ^
NOUNLOAD, STATS = 10"
Para permitir que isso o trabalho com nomes de arquivos usando espaços, é necessária uma versão modificada da resposta aceita:
FOR /F "delims=" %%I IN ('DIR . /B /O:-D') DO COPY "%%I" <<NewDir>> & GOTO :END
:END
@ Chris Noe
Note que o espaço em frente ao e se torna parte do comando anterior. Isso tem me mordido com SET, que felizmente coloca espaços em branco para o valor.
Para contornar a de espaços extras a ser adicionado a uma variável de ambiente, envolva o comando set em parênteses.
por exemplo. FOR /F %%I IN ('DIR "*.*" /B /O:D') DO (SET NewestFile=%%I)
Eu sei que você pediu para Windows, mas pensei que eu gostaria de acrescentar isso de qualquer maneira, em Unix / Linux você poderia fazer:
cp `ls -t1 | head -1` /somedir/
que irá listar todos os arquivos no diretório atual classificadas por tempo de modificação e, em seguida, cp do mais recente para / somedir /
Isto irá abrir uma segunda janela cmd. Se você quer que ele vá embora, substitua o / K com / C.
Obviamente, substituir new_file_loc com o que o seu novo local de arquivo será.
@echo off
for /F %%i in ('dir /B /O:-D *.txt') do (
call :open "%%i"
exit /B 0
)
:open
start "window title" "cmd /K copy %~1 new_file_loc"
exit /B 0
@echo off
set source="C:\test case"
set target="C:\Users\Alexander\Desktop\random folder"
FOR /F "delims=" %%I IN ('DIR %source%\*.* /A:-D /O:-D /B') DO COPY %source%\"%%I" %target% & echo %%I & GOTO :END
:END
TIMEOUT 4
A minha tentativa de copiar o novo arquivo de uma pasta ??p>
apenas definir suas pastas de origem e de destino e ele deve funcionar
Este pastas ignora-se apenas com preocupação arquivos
recomendaria que você escolher filetype no caminho DIR mudando *.*
para *.zip
por exemplo
TIMEOUT não vai funcionar no WinXP Acho
Bash:
find -type f -printf "%T@ %p \n" \
| sort \
| tail -n 1 \
| sed -r "s/^\S+\s//;s/\s*$//" \
| xargs -iSTR cp STR newestfile
onde "newestfile" vai se tornar o newestfile
Como alternativa, você poderia fazer newdir / STR ou apenas newdir
Breakdown:
- lista todos os arquivos em {time} {file} formato.
- tipo los pelo tempo
- começar o último
- cut off do tempo, e espaço em branco do início / fim
- Copiar valor resultante
Importante
Depois de executar esta vez, o mais novo arquivo será o que você acabou de copiar: p (assumindo que ambos estão no mesmo escopo da pesquisa que é). Então você pode ter que ajustar o que filenumber você copiar se você quer este trabalho mais de uma vez.