Renomeando datas no windows cmd

0

Eu tenho vários diretórios (pastas, se você preferir) que seguem esse padrão

\20121022 Description of the directory's contents goes here\  

(alguns não têm, apenas a data)

e preciso renomeá-los para seguir o seguinte padrão

\2012-10-22 Description of the directory's contents ...\

Existe uma maneira de fazer isso usando o cmd do Windows e as ferramentas que o acompanham (a saber, ren)? Caso contrário, qual seria a maneira mais portátil de fazer isso? Eu tenho um conjunto muito restrito de privilégios na máquina em que estou fazendo isso.

Torre
fonte

Respostas:

4

Se você começar com o nome do diretório em uma variável, como fdir:

set "fdir=20121022 Description of this directory"

Em seguida, seu arquivo em lotes pode dividir o nome do diretório:

set "fdiryear=%fdir:~0,4%"
set "fdirmonth=%fdir:~4,2%"
set "fdirday=%fdir:~6,2%"
set "fdirdesc=%fdir:~8%"

neste ponto, as variáveis ​​se parecem com:

fdir=20121022 Description of this directory
fdiryear=2012
fdirmonth=10
fdirday=22
fdirdesc= Description of this directory

Em seguida, defina o novo nome do diretório e renomeie o diretório:

set "fnew=%fdiryear%-%fdirmonth%-%fdirday%%fdirdesc%"
ren "%fdir%" "%fnew%"

o novo nome do diretório será:

fnew=2012-10-22 Description of this directory

Se você puder me fornecer mais informações sobre como deseja coletar a lista de nomes de diretório, posso fornecer um script mais completo.

Por exemplo, se todos os diretórios estiverem no diretório atual, o arquivo em lotes ficaria assim:

@echo off

echo.
for /D %%f in ("2010*", "2011*", "2012*") do call :work "%%~f"
echo.
set "fdir="
set "fdiryear="
set "fdirmonth="
set "fdirday="
set "fdirdesc="
goto :EOF


:work
set fdir=%~1
set "fdiryear=%fdir:~0,4%"
set "fdirmonth=%fdir:~4,2%"
set "fdirday=%fdir:~6,2%"
set "fdirdesc=%fdir:~8%"

set "fnew=%fdiryear%-%fdirmonth%-%fdirday%%fdirdesc%"
echo Renaming folder "%fdir%" to "%fnew%"
rem    ren "%fdir%" "%fnew%"
goto :EOF

Explicações:

Isso desativará o eco dos comandos conforme eles são executados para evitar muita confusão na tela:

@echo off

Isso exibirá uma linha em branco:

echo.

O comando for:

for /D %%f in ("2010*", "2011*", "2012*") do call :work "%%~f"

/D means to search for matches of Directory names only.
If you omit the /D, it will search for matches of Filenames only.

%%f (%%~f) is a variable name that gets set to the names of the matched directories.

[in ("2010*", "2011*", "2012*")] is a list of patterns to search for. 
In this case, it will only process directories that begin with a year: 
2010, or 2011, or 2012. You can edit this list for your needs. If you 
know that all directories in the current folder are in the same format 
and are candidates to be renamed, the list can be simply: ("*") like:  
for /D %%f in ("*") do call :work "%%~f"

the word "do" simply precedes the command that you want to "do" for each 
match found.

call :work says to execute the commands at the label :work for each match.

"%%~f" says to pass the matched directory name as the first argument to the 
commands at the label you specified (:work)  

The "~" in "%%~f" says to remove "quote" marks from %%f to avoid passing the 
directory name inside of 2 sets of "quote" marks. For example, if %%f contained 
"20121022 Description of this directory" then using "%%f" would pass 
""20121022 Description of this directory"", which would fail. "%%~f" will pass 
exactly 1 set of "quotes".

Depois que todos os nomes de diretório correspondentes são processados, a execução retorna ao "eco". comando que segue o comando "for ...".

A seguir, são apenas algumas "limpezas" para limpar as variáveis ​​usadas no script, para que elas não acumulem e desorganizem o espaço da variável (ambiente).

set "fdir="
set "fdiryear="
set "fdirmonth="
set "fdirday="
set "fdirdesc="

A próxima instrução sai do script em lote e termina a execução.

goto :EOF

Em seguida é o rótulo

:work

Labels begin with a colon at the first column followed by a 
label name made up of letters and numbers (no spaces). Labels are 
the targets of call and goto commands.  

Então o comando:

set fdir=%~1

Sets the variable named "fdir" to be the directory name that was 
passed from the "for" command.

The "~" in %~1 means to use the name only without any surrounding "quote" marks.

Os próximos comandos:

set "fdiryear=%fdir:~0,4%"
set "fdirmonth=%fdir:~4,2%"
set "fdirday=%fdir:~6,2%"
set "fdirdesc=%fdir:~8%"
set "fnew=%fdiryear%-%fdirmonth%-%fdirday%%fdirdesc%"

Split up the directory name into the desired pieces, and 
define the "new" directory name.

O próximo comando:

echo Renaming folder "%fdir%" to "%fnew%"

Just displays the old and new directory names so you can see the 
progress on the screen.

E os últimos comandos:

rem    ren "%fdir%" "%fnew%"
goto :EOF

Renames the directory and then "exits" to return from the call.

Nota: Fiz o comando real para renomear o diretório como um comentário para que você possa executar o arquivo em lotes e ver o que acontecerá sem renomear nada. Depois de executá-lo e ter certeza de que os diretórios corretos serão renomeados corretamente, você pode editar a linha para renomear o diretório e executar o script em lote novamente.

Para fazer isso, remova o "rem" da linha para:

rem    ren "%fdir%" "%fnew%"

Becomes:

ren "%fdir%" "%fnew%"
Kevin Fegan
fonte
"como você deseja coletar a lista de nomes de diretório" - eu realmente não posso dizer. Não escrevo scripts em lotes com tanta frequência; é só agora que eu tenho que fazer isso ... você poderia dar uma sugestão? Eu executarei o script no diretório superior, no qual estão localizados todos os diretórios inferiores (1º nível). Nenhum deles tem subdiretórios.
Rook
@ Kevin: Por que você adiciona um espaço entre %fdirday%e %fdirdesc%? A maneira como você está capturando, %fdirdesc%já começará com um espaço. Você poderia apenas definir fdirdaya %fdir:~6%e dispensar fdirdesc.
Scott
@ Scott Obrigado por pegar isso. O espaço não deveria estar lá. Eu editei a resposta para corrigir isso. Sua sugestão para definir fdirday=%fdir:~6%é uma ótima alternativa. Eu apenas pensei que seria mais fácil exibir e explicar se fdirdaycontivesse apenas o day.
quer
@ldigas Eu forneci um script em lote que deve funcionar para você. Como é, ele exibirá os diretórios que serão renomeados. Siga as instruções no final da resposta para permitir que o script em lote renomeie os diretórios.
precisa
@ KevinFegan - Obrigado (escusado será dizer, mas mesmo assim) pelo esforço que você colocou nisso. Não estou no meu computador de trabalho agora, mas tentarei testá-lo amanhã.
Rook