Como eu faço um find-replace em uma string de arquivo de lote do windows?

0

Eu quero alterar uma variável de some\original\path para some\replaced\path fazendo uma substituição de localização e alterando a parte "original" no caminho.

set x=some\original\path
set y= ????
(y is now some\replaced\path)

Como eu faria isso em um arquivo de lote do Windows? Note que:

  • Eu quero manter o código flexível para que não seja necessário codificar as strings ou os índices de caracteres
  • Eu também estou bem com uma solução Powershell. Eu estou procurando o que é mais simples, mais sustentável e pode ser executado na minha máquina com Windows 7.

Solução:

Nos arquivos em lote, você pode fazer substituições de string no processo de interpolação %%

set y=%x:original=replaced%
    
por hugomg 28.11.2011 / 23:55

4 respostas

1

Editar: Para responder à pergunta esclarecida:

Se você puder garantir que original seja sempre o mesmo e esteja apenas no caminho uma vez, use:

@Echo Off
Set "Find=original"
Set "Replace=replaced"
Set "OldPath=%~1"
Call Set "NewPath=%%OldPath:\%Find%\=\%Replace%\%%"
Echo %NewPath%

Isso substituirá a primeira instância de \original\ por \replaced\ . Teste:

C:\> ChangePath.bat "Alice\original\Clive"
Alice\replaced\Clive

C:\> ChangePath.bat "Alice\original\Clive\Denver"
Alice\replaced\Clive\Denver

C:\> ChangePath.bat "Alice\Bob\original\Clive"
Alice\Bob\replaced\Clive

Resposta anterior

Para alterar a segunda seção do caminho, você pode usar:

@Echo Off
Set "Replace=Replacement Path"
Set "PathABC=%~1"
Set "PathBC=%PathABC:*\=%"
Call Set "PathA=%%PathABC:\%PathBC%=%%"
Set "PathC=%PathBC:*\=%"
Set "NewPath=%PathA%\%Replace%\%PathC%"
Echo %NewPath%

Teste:

C:\> ChangePath.bat "Alice\Bob\Clive"
Alice\Replacement Path\Clive

Isso depende de não haver nenhuma barra inicial. Ele substitui o texto entre a primeira e a segunda barra.

Editar: para explicar o que %% significa.

%% é um método para escapar do sinal de porcentagem. Se eu escrevesse a seguinte linha, trataria % Green 50% como uma variável. Como essa variável é indefinida, ela gravará a seguinte saída.

C:\> Echo Red 90% Green 50% Blue 5%
Red 90 Blue 5%

O que preciso escrever é:

C:\> Echo Red 90%% Green 50%% Blue 5%%
Red 90% Green 50% Blue 5%

A seguinte linha passa por algumas transformações. Aqui está cada passo de sua transformação.

:: Original line
Call Set "NewPath=%%OldPath:\%Find%\=\%Replace%\%%"

:: The variables encased in single '%' are evaluated:
Call Set "NewPath=%%OldPath:\original\=\replaced\%%"

:: 'Call' runs the rest of the line as a command.  The '%%' are evaluated to '%'.
Set "NewPath=%OldPath:\original\=\replaced\%"

:: The search and replace on 'OldPath' occurs.
Set "NewPath=Alice\replaced\Clive"

:: The final command is processed.
    
por 29.11.2011 / 00:28
2

Com o PowerShell, você pode usar o operador -replace :

$x = 'some\original\path'
$y = $x -replace 'original','replaced'

O operador -replace usa expressões regulares, então você também pode fazer:

$y = $x -replace '\\w+\','\replaced\'
    
por 29.11.2011 / 00:31
1

Não está claro se é isso que você deseja, mas no PowerShell, a substituição de strings é bem fácil:

$x = "some\original\path"
$y = $x.Replace("original", "replaced")

Você deve ter o que queria (espero).

    
por 29.11.2011 / 00:29
0

Em Powershell, para substituir uma string:

$string1 = "blah1\blah2.txt"
$toFind = "blah1"
$toReplace = "blah2"
$string1 = $string1.replace($toFind,$toReplace)

    
por 29.11.2011 / 00:27