Preciso renomear muitos arquivos que contêm um nome e um número de crachá.
Os arquivos ficam assim: "John Doe 1234.txt" e devo renomeá-lo para 1234.txt
(o novo arquivo deve conter apenas o número do crachá).
Além disso, o número do crachá não é fixo, pode conter 3-4 números.
Atualização: o nome do arquivo contém 2-3 nomes separados por espaços. Ex: "John Doe 123.txt" ou "John Junior Doe 1234.txt"
Eu estava pensando em excluir todas as letras e espaços do nome e manter apenas os números, mas não conheço o Powershell o suficiente.
Alguém pode me ajudar?
Supondo que todos os nomes de arquivo estejam no formato "First Last Number.txt
Você pode correr:
Altere a primeira linha para corresponder ao seu caminho. (cole o trecho inteiro e pressione enter duas vezes)
Os nomes de arquivo não podem conter caracteres especiais (O CÓDIGO AGORA É INfalível./\:*?"<>|
), mas podem conter caracteres como%
e!
que podem causarcmd.exe
interceptação incorreta, portanto, o código não é infalível.Captura de tela:
Nota : só pode lidar com até 31 arquivos, por causa doMINHA SUGESTÃO ESTAVA ERRADA. Ele pode lidar com arquivos infinitos, por causa dosSETLOCAL
SETLOCAL
arquivosENDLOCAL
.PowerShell:
Edite $Source conforme necessário. O parâmetro " -WhatIf " significa que o código postado pode ser executado para verificar se os arquivos desejados foram encontrados e o NewName está correto. Remova o parâmetro "- WhatIf " para realmente renomear os arquivos.
presumindo que todos os arquivos de entrada terminem com um espaço e pelo menos um dígito, isso parece mais uma maneira de fazer o trabalho. ele NÃO verifica se há números falsos, embora. [ sorriso ]
o que faz ...
. Estou sempre preocupado em destruir os arquivos originais, então isso os copia em vez de renomeá-los . se você quiser fazer isso diretamente, substitua o
Copy-Item
porRename-Item
.remover toda a região quando você estiver pronto para fazer as coisas de verdade.
.BaseName
props NÃO terminem com um espaço e pelo menos um dígito.Basename
nos espaços e pega o último item nos resultados.Extension
prop ao acima-PassThru
naCopy-Item
linha envia informações "criou um arquivo" para a telao código ...
Você pode fazer isso com um arquivo em lote usando o método a seguir.
Isso funcionará independentemente de quantas letras e espaços estejam no início.
Você não precisa criar um arquivo temp.log adicional para executar esta tarefa, nem se preocupar com caracteres não numéricos no nome do arquivo...
Se você estiver usando
U N I C O D E
para fazer isso, filtrar no loopfor
e obter apenas a saída de números do nome do arquivo, onde isso pode ser feito por:1)
cmd /u
vaiecho\string
nomear personagem por personagem2)
findstr [0-9]
obterá!_n!
apenas o número da variável no loop%%~n
3) Use uma variável
!_n!
para incrementar o%%~n
caractere juntando apenas números de saídaPara ajuda na linha de comando, você pode usar
/?
:Na internet, você pode obter mais ajuda em:
popd
Achar
Pushd
Onde
para /f
Findstr
Tempo esgotado
Definir local
Endlocal
Ren / Renomear
Ir para: EOF
EnableDelayedExpansion
Se, senão se, senão, se definido, nível de erro...
Sinto muito meu inglês limitado