No Windows 10 cmd.exe, o comando del *.tmp
pode excluir silenciosamente arquivos como project.tmpl
.
Existe alguma opção, solução alternativa, entrada de registro ou sacrifício ritual para evitar isso?
Para os incrédulos: na minha máquina, na qual a unidade C: foi formatada por um instalador do Windows 10 em 2020:
(onde a mensagem de erro em francês significa arquivo não encontrado ).
Um arquivo pode ter nomes curtos do DOS 8.3 e todos os comandos internos da era do DOS também funcionam com nomes longos e curtos por motivos de compatibilidade 1 , de modo que um arquivo com extensão longa pode ser acidentalmente correspondido. Há muitas perguntas semelhantes:
Seria melhor usar o PowerShell porque os nomes curtos não são mais correspondentes.
dir
in cmd deve corresponder aos nomes curtos para não interromper os programas herdados. O PowerShell não tem essa limitação. Basta executarRemove-Item *.tmp
ou qualquer um de seus aliases comorm *.tmp
,del *.tmp
No cmd você terá que filtrar
findstr
assim(Substituir
%f
por%%f
em um arquivo de lote)Existem também muitas outras soluções, como
forfiles
(já que não é um comando interno do cmd) que você pode encontrar em Como posso obter os comandos "dir" e "copy" para operar em "*.xyz", mas não em "*.xyz~ "?No entanto, será ainda melhor desabilitar a geração de nomes 8.3 e remover todos os nomes curtos. Na verdade, como os volumes recém-formatados do Windows 8 e do Windows Server 2012 terão a geração de nome 8.3 desabilitada por padrão por motivos de desempenho. Isso também ajudará a evitar situações como esta: WinXP dir command: extensões de 3 e 4 caracteres são iguais?
Se sua unidade ainda tiver a geração de nome 8.3 habilitada, execute o seguinte comando para desativá-la na unidade C:
ou execute
fsutil 8dot3name set 1
para desativá-lo em todos os volumesA configuração também pode ser definida no registro. A chave correspondente é
HKLM\System\CurrentControlSet\Control\FileSystem\NtfsDisable8dot3NameCreation
. O valor para ofsutil
e a chave do registro é assimSe os nomes estiverem lá, eles também podem ser removidos com
fsutil 8dot3name strip
Observe que
fsutil
deve ser executado com privilégios de administrador1 Comandos antigos listam seus arquivos usando a
FindFirstFile
API antiga que corresponde a nomes longos e curtos. Consulte Por queFindFirstFile
encontra nomes curtos? . O novo código deve usarFindFirstFileEx
em vez disso para evitar issoO motivo disso acontecer é que o Windows manteve a compatibilidade com nomes de arquivo do MS-DOS , onde os nomes de arquivo eram limitados a uma extensão de 3 caracteres. Para facilitar a transição, o Windows 95 introduziu um modo de compatibilidade onde cada arquivo possui um alias “8.3”, também conhecido como “nome abreviado” do arquivo: além de
project.tmpl
, o mesmo arquivo também pode ser acessado comoPROJEC~1.TMP
. Você pode ver esses nomes curtos nas listagens de diretórios comdir /x
. O padrão curinga*.tmp
corresponde a esse nome alternativo (os nomes de arquivo não diferenciam maiúsculas de minúsculas). A Microsoft documenta isso paradir
; também se aplica a outros comandos, incluindodel
.Posso reproduzir o comportamento que você observou em minha máquina corporativa com Windows 10 (não atualizada de um Windows 10 anterior). Tenho privilégios de administrador local, mas não administrador de domínio, e não tenho permissão para executar
fsutil 8dot3name query c:
(Error: Access is denied.
).Se você controlar a parte do sistema que está produzindo os arquivos temporários, uma solução robusta é dar a eles uma extensão que não tenha 3 (ou 0) caracteres.
*.tm
ou*.temp
não corresponderia a 8.3 aliases de nomes de arquivos com uma extensão diferente. Como alternativa, coloque esses arquivos temporários em um diretório separado e remova o diretório inteiro quando quiser excluí-los.Além da solução baseada em CMD fornecida na resposta do phuclv , você pode usar o comando FORFILES not-well-known-but-very-cool :
O parâmetro "search mask" (
/M
) não corresponde aos nomes 8.3, portanto .tmp e .tmpl são duas extensões diferentes sem qualquer filtragem adicional. A máscara de pesquisa também não diferencia maiúsculas de minúsculas.Por exemplo:
Você precisa de um
for loop
para evitar que algum terceiro arquivo com caracteres adicionais após ".tmp
" seja excluído também ...O comando where retornará apenas arquivos
.end
com.tmp
(somente)...Você também pode tentar
/R
ecursivo:Não sei explicar o motivo desse evento que aconteceu com você, mas acontece comigo também...Agora eu sei ... @phuclv explicou em sua resposta ... plz, considere sua resposta
For /f
withwhere
para manter arquivos*.tmp*
Também não sei explicar porque esse evento não acontece com @spikey_richie...