Script em lote para renomear aleatoriamente um único arquivo selecionado

2

Estou tentando criar um script batch / .bat que renomeia um único arquivo para uma cadeia aleatória de caracteres. Tudo o que encontrei na pesquisa até agora é renomear todos os arquivos em um único diretório - o que é apenas um pouco mais do que estou procurando.

O script de exemplo a seguir é a base do que estou trabalhando. Ele basicamente renomeia todos os arquivos .txt no diretório de trabalho para algum nome de arquivo aleatório com 8 caracteres, preservando a extensão do arquivo:

@echo off
setlocal disableDelayedExpansion
set "chars=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
for /f "eol=: delims=" %%F in ('dir /b /a-d *.txt') do call :renameFile "%%F"
exit /b

:renameFile
setlocal enableDelayedExpansion
:retry
set "name="
for /l %%N in (1 1 8) do (
  set /a I=!random!%%36
  for %%I in (!I!) do set "name=!name!!chars:~%%I,1!"
)
echo if exist !name!.jpg goto :retry
endlocal & ren %1 %name%.txt

A razão pela qual estou procurando apenas renomear um único arquivo é porque meu objetivo final é criar uma extensão de shell que use o script - estou querendo poder clicar com o botão direito em um único arquivo, clicar em "Renomear Aleatório ", e chama o arquivo de lote para renomear o arquivo selecionado para algum nome aleatório.

Se alguém tiver alguma entrada ou modificação no código mencionado acima que me ajudaria, seria ótimo! Obrigado

    
por amy 15.12.2015 / 06:37

2 respostas

2

Como posso alterar meu arquivo em lote para renomear um único arquivo para uma cadeia aleatória de caracteres?

Você pode passar o nome do arquivo que deseja alterar como um argumento %1 para o arquivo em lote.

Aqui está o arquivo de lote modificado:

@echo off
setlocal enableDelayedExpansion
set "chars=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
:retry
set "name="
for /l %%N in (1 1 8) do (
  set /a I=!random!%%36
  for %%I in (!I!) do set "name=!name!!chars:~%%I,1!"
)
if exist !name!%~x1 goto :retry
endlocal & ren %1 %name%%~x1

Notas:

  • Apenas a parte do nome do arquivo de %1 é aleatória.
  • A extensão existente é preservada.

Exemplo:

F:\test>dir *.dat
 Volume in drive F is Expansion
 Volume Serial Number is 3656-BB63

 Directory of F:\test

15/12/2015  12:59                 0 random.dat
               1 File(s)              0 bytes
               0 Dir(s)  1,776,913,768,448 bytes free

F:\test>test random.dat

F:\test>dir *.dat
 Volume in drive F is Expansion
 Volume Serial Number is 3656-BB63

 Directory of F:\test

15/12/2015  12:59                 0 IYSPA2FS.dat
               1 File(s)              0 bytes
               0 Dir(s)  1,776,913,768,448 bytes free

Leitura Adicional

por 15.12.2015 / 14:00
-1

É muito simples. Aqui está o arquivo em lote:

@echo off
set name=%1
set newname=%random%%random%
ren %name% %newname%.txt

Depois disso, você precisa ir ao registro para a seção com o nome da extensão de arquivo que você deseja renomear. No meu caso eu vou para HKEY_CLASSES_ROOT\.txt e verifico qual é o valor da chave Default. No meu caso, é o arquivo Notepad ++ _. Então eu vou para HKEY_CLASSES_ROOT\Notepad++_file , criar uma nova subchave, por exemplo "Renomear para aleatório" e subchave "comando" nele (sem aspas). Em HKEY_CLASSES_ROOT\Notepad++_file\shell\Rename to Random\command , edito o valor padrão para "C:\Temp\random_rename.bat" "%1" (com aspas!)

Depois disso, quando clico com o botão direito do mouse em cada arquivo txt e escolho a opção Renomear para Aleatório, ele é renomeado para o nome de 8 dígitos.

P.S. Edite o caminho para o local real do seu arquivo em lotes quando adicioná-lo ao registro. Além disso, você pode editar uma variável %newname% para o que você quiser. No meu caso, o nome é combinado de dois grupos de 4 dígitos, cada um deles é gerado pela variável de sistema %random% .

Verifique este para ações passo a passo no registro.

    
por 15.12.2015 / 12:39