Replace filename via MSDOS prompt

Asked

Viewed 100 times

0

I am creating a job and would like to replace part of a file name.

I use the following:

"rename" | caminho onde devo atualizar + nome_anterior | novo_nome

However, using the above option, my file name pattern is invalid.

For example: My file: TESTE_ARQUIVO_202111301 New Archive: NOVO_20211301(should be)

However, using the above command, my file looks like this:

Code used: rename \\\caminho onde devo atualizar\TESTE_ARQUIVO_* NOVO_* Result: NOVO__ARQUIVO_202111301 Expected result: NOVO_20211301

In that case, I just need to replace "TESTE_ARQUIVO_" for "NOVO_" , and keep the rest of the information TESTE_ARQUIVO_data do arquivo, but the command does not substring as I need.

Can someone help me?

1 answer

1

*/ EDIT

1. You have to use variable replace/substring (changes to the content of the character string in the variable that stores the name), in your case, define the name and operate the substitutions:

  • Removing strings in variable (using replace unreplaceable):
Set "_Var=!_Var:    String    =        !" <==>  Set "_Var=!_Var:String=!"
Set "_Var=!_Var:    String    = N a d a  A q u i !" <==>  Set "_Var=!_Var:Remover=!"  
Set "_Var=!_Var:TESTE_ARQUIVO_= N a d a  A q u i !" <==>  Set "_Var=!_Var:TESTE_ARQUIVO_=!"
  • Replacing strings in variable (using replace):
Set "_Var=!_Var:    String    =      ⇩      !" <==>  Set "_Var=!_Var:string=adicionar!"
Set "_Var=!_Var:    String    = Substituir Por !" <==>  Set "_Var=!_Var:Replace=EssaString!"  
Set "_Var=!_Var:TESTE_ARQUIVO_= Substituir Por !" <==>  Set "_Var=!_Var:TESTE_ARQUIVO_=NOVO_!"

2. Use the command Rename string*.* stringNOVO_*.* is too vague to run on one or multiple files/names, does not work well so:

  • Commando rename and as the command interpreter () will take over/understand and execute "mechanically":
rem ::  vai renomear todos os arquivos de todas as extensões
rem ::  onde a string no nome literalmente bata com "a_string"
rem ::  alterando para "b_string" apenas o nome e mantendo a extensão:

        >rename a_string.*         b_string.*
rem ::  resulta a_string.txt  ==>  b_string.txt 
rem ::  resulta a_string.jpg  ==>  b_string.jpg 
rem ::  resulta a_string.rar  ==>  b_string.rar
rem ::  vai renomear todos os arquivos com a extensão .txt onde o primeiro 
rem ::  caractere no nome bater com "a" e a sua extensão for igual ".txt", 
rem ::  alterando o primeiro caractere "a" no nome para "b", e mantendo
rem ::  as outras strings no nome e a extensão do arquivo:
rem ::  susbtituir o primeiro caractere a por b

        >rename a*.txt             b*.txt
rem ::  resulta a_string.txt  ==>  b_string.txt 
rem ::  vai renomear todos os arquivos com a extensão .txt onde o primeiro caractere no
rem ::  nome for igual a "a", e alterando o tambem o segundo caractere no nome, onde
rem ::  o primeiro ele vai alterar de "a" para "b", e o (um) segundo caracter
rem ::  qualquer, ele vai alterar de "?" para "b", e mantendo as strings restantes
rem ::  (do terceiro carater ao último caractere) no nome e a sua extensão sem
rem ::  alterações, alterando o primeiro e um segundo caractere no nome
rem ::  susbtituir o primeiro e o segundo caractere por bb 

        >rename a*.txt bb*.txt
rem ::  resulta a_string.txt  ==> bbstring.txt 
rem ::  vai renomear todos os arquivos com a extensão .txt onde o primeiro caractere no 
rem ::  nome for igual a "a", e alterando o tambem o segundo e terceiro caracteres no 
rem ::  nome, onde o primeiro ele vai alterar de "a" para "b", o (um) segundo caracter
rem ::  qualquer e o (um) terceiro caracter qualquer ele vai alterar de "??" para "bb",
rem ::  e mantendo as strings restantes (do quarto carater ao último caractere) no
rem ::  nome e sua extensão sem alterações, assim soment alterando o primeiro, 
rem ::  o segundo e também o terceiro caractere no nome do arquivo
rem ::  susbtituir primeiro, segundo e terceiro caractere por bbb 

        >rename a*.txt bbb*.txt
rem ::  resulta a_string.txt ==>  bbbtring.txt
rem ::  da mesma forma que ocorreu nas ações acima, você também voce 
rem ::  pode entender que o ocorreu com o seu comando, onde os seus 
rem ::  cinco primeiros caracteres foraam susbtituidos por 
rem ::  outros cinco caracteres, renomeando o seu arquivo:
rem ::    de "TESTE_ARQUIVO_*"
rem ::  para "NOVO_*" 
rem ::
rem ::    O contraio também não funciona:
rem ::
rem ::    // nome de origem não é explicitado, é selecionado
rem ::    de "NOVO_*"
rem ::    // nome de destino não é explicitado, é selecionado  
rem ::  para "TESTE_ARQUIVO_*"

3. To understand what happens, you need to realize the difference of selecting x explicitly:

rem ::  nome de arquivo é passado para o interpretador por seleção
rem ::  todos os arquivos que iniciam por TESTE_ARQUIVO_ e contenha
rem ::  qualquer comprimento de carateres (*) após a string TESTE_ARQUIVO_, 
rem ::  passe ao comando interno rename/ren o (ou cada) arquivo para renomear 
rem ::  para NOVO_+todas as strings restantes, assim substituindo no arquivo(s) 
rem ::  selecionado(s), os cinco primeiras caracteres no nome, no seu caso, subtituir 
rem ::  TESTE pelos cinco caracters passadas na selação para destino, NOVO_

        >rename "TESTE_ARQUIVO_*.txt" "NOVO_*.txt"
rem ::  resulta TESTE_ARQUIVO_202111301.txt  ==>  NOVO__ARQUIVO_202111301.txt

rem :: passando de forma explicita os nomes de de origem e destino
        >rename "TESTE_ARQUIVO_202111301.txt" "NOVO_20211301.txt"

4. It would be the case to use one for loop to make the source file names to be passed in variables that can expand to the explicit form, and also with the destination names, but in these, using variables with the Replaces facilitating the use of explicitly:

for %i in ("\\caminho onde devo atualizar\*nome_anterior*.*")do set "_Nome=%~nxi" && cmd/v/c (ren "%~i" "!_Nome:Teste_Arquivo_=!")

rem ::  esse loop vai te trazer em %i, o caminho completo e o nome do arquivo 
rem ::  de forma já explicita de cada arquivo que atende a seleção, dai é 
rem ::  fazer uso no comando rename "%~i" ....

rem ::  defina o nome que retona na variavel %~i, já expandindo a variavel 
rem ::  para a forma explita compondo com replace, o nome explicito do destino
rem ::  Nome eXtensão de %i 
rem ::  set "_Nome=%~nxi"

rem :: force a expanção da variável com atraso em tempo de execução 
rem :: para remover !_Nome:Teste_Arquivo_=!
rem :: "!_Nome:Teste_Arquivo_=!"

rem ::  as duas ações um só comando
rem ::  set "_Nome=%~nxi" && cmd/v/c (ren "%~i" "!_Nome:Teste_Arquivo_=!")

EDIT */




rename \\caminho onde devo atualizar\TESTE_ARQUIVO_* NOVO_

Are you trying to apply/use a syntax of cmd/rename in Powershell, it doesn’t work well like this...

Get-ChildItem -File '\\caminho onde devo atualizar' | rename-item -NewName {$_.name -replace 'ARQUIVO_',''} -WhatIf

Get-ChildItem -File list your files

  • Using alias:
gci -af '\\caminho onde devo atualizar' | ren -New {$_.name -replace 'ARQUIVO_',''} -WhatIf 

Note: 1 Does not apply to subdirectories, in such cases use: -Directory or -re

| ren -new Each item/file listed is redirected to rename by setting the new name where the string is removed ARQUIVO_


Note: 2 To apply subfolders and not to files, remove -FILE | -af and add recursion -Directory or -ad

gci -ad -r '\\caminho onde devo atualizar' | ren -New {$_.name -replace 'ARQUIVO_',''} -WhatIf

Note: 3 Using -WhatIf, Powershell gives you a forecast of the actions that will be executed, without effectively changing anything, so use to make sure that the command will be applied from the correct folder and files, then just remove -WhatIf

gci -af '\\caminho onde devo atualizar' | ren -New {$_.name -replace 'ARQUIVO_',''}

Note: 4 To apply the action only to a defined extension:

gci -af '\\caminho onde devo atualizar\*.xlsx' | ren -New {$_.name -replace 'ARQUIVO_',''} -WhatIf

Note: 5 To apply the action to a group of defined extensions:

'*.pdf','*.txt','*.rar' | % {gci -af -r '\\caminho onde devo atualizar' | ren -New {$_.name -replace 'ARQUIVO_',''} -WhatIf }

  • So this command needs to run at the MSDOS prompt, not in the Powershell (Updated Title)....

  • MSDOS prompt? It was not extinguished in the 90’s? MS-DOS prompt is the same thing as cmd?

  • 1

    @Yoyo This is more for speaking mode that refers/association to prompt de comando in the current command interpreter (cmd.exe for the former users of command.com in the Prompt/MS-DOS)

  • @Valtersilva Eh I guided by Tag Powershell of his previous edition

Browser other questions tagged

You are not signed in. Login or sign up in order to post.