Script em lote para renomear aleatoriamente um único arquivo selecionado

2

Estou tentando usar um script em lote / .bat que renomeie um único arquivo para uma seqüência aleatória de caracteres. Tudo o que encontrei na pesquisa até agora é renomear todos os arquivos em um único diretório - o que é um pouco mais do que estou procurando.

O exemplo de script a seguir é a base do que estou trabalhando. Ele basicamente renomeia todos os arquivos .txt no diretório de trabalho para um nome aleatório de 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 pretendo renomear apenas um único arquivo é porque meu objetivo final é criar uma extensão de shell que use o script - eu quero poder clicar com o botão direito do mouse em um único arquivo, clicar em "Renomear Aleatório", e chama o arquivo em lotes para renomear o arquivo selecionado para algum nome aleatório.

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

Amy
fonte

Respostas:

2

Como posso alterar meu arquivo em lotes para renomear um único arquivo para uma sequência aleatória de caracteres?

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

Aqui está o arquivo em lotes 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:

  • Somente a parte do nome do arquivo %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

  • Um índice AZ da linha de comando do Windows CMD - uma excelente referência para todos os itens relacionados à linha de cmd do Windows.
  • enabledelayedexpansion - A expansão atrasada fará com que as variáveis ​​sejam expandidas no tempo de execução e não no tempo de análise.
  • for / l - Execute condicionalmente um comando para um intervalo de números.
  • parâmetros - Um argumento de linha de comando (ou parâmetro) é qualquer valor passado para um script em lote.
DavidPostill
fonte
Era exatamente isso que eu precisava para um bom ponto de partida. Além disso, o link do Índice AZ que você forneceu parece extremamente útil. Obrigado!
amy
-1

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

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

Depois disso, você precisa acessar o registro na seção com o nome da extensão do arquivo que deseja renomear. No meu caso, vou HKEY_CLASSES_ROOT\.txte verifico qual é o valor da chave Padrão. 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" (sem aspas). Em HKEY_CLASSES_ROOT\Notepad++_file\shell\Rename to Random\commandEu 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 escolhe a opção Renomear para Aleatório, ele é renomeado para o nome de 8 dígitos.

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

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

Hardoman
fonte
Isso não funciona. %RANDOM%gera um número inteiro aleatório de 0 a 32.767, portanto,% random %% random% não tem garantia de retornar exatamente 8 dígitos. Além disso, o script OPs produz 8 caracteres e não 8 dígitos.
DavidPostill
@DavidPostill Isso não foi declarado nos requisitos de que deveria obrigatoriamente gerar apenas 8 caracteres.
Hardoman
Não, mas ele disse que queria usar uma versão modificada de seu script existente.
DavidPostill