Procurando criar um arquivo de lote capaz de editar uma linha (ou palavra) em um arquivo de texto

3

Eu tenho um arquivo de texto (... \ config.txt) contendo 2 linhas que se parece com:

Preamp: -4 dB
Include: surround.txt

Eu preciso alterar "surround" para "fones de ouvido" nesse arquivo de configuração. Eu realmente preciso fazer 2 arquivos em lote. Um para "fones de ouvido" e outro para "surround".

O arquivo de configuração em questão é um arquivo relacionado ao EqualizerAPO que chama um arquivo separado contendo configurações de EQ para um ambiente de escuta específico. No exemplo acima, "surround". No entanto, pode haver muitos outros. Esse arquivo de configuração, quando salvo, aciona automaticamente as configurações de EQ que ele está chamando sob a linha "include". A razão que eu preciso disso é porque, se eu precisar mudar o ambiente de escuta para outra coisa, eu preciso navegar para o diretório, abra o arquivo config.txt, edite o "Incluir" seção às minhas necessidades, depois salve. Torna-se tedioso quando tenho que mudá-lo quando surge a necessidade. Eu realmente preciso de uma solução de um clique. Qualquer ajuda seria muito apreciada. Obrigada!

EDITAR:

O diretório (contendo o arquivo "config.txt" mencionado anteriormente):

C:\Program Files\EqualizerAPO\config\

contém 2 tipos de arquivos de texto: arquivos de configurações de EQ (por exemplo, fones de ouvido, surround, teatro, etc. Basicamente, os arquivos que os usuários criam e exportam em formato TXT via software chamado Room EQ Wizard. Vou chamá-los de arquivos "referência".) O outro é o arquivo de configuração real que o EqualizerAPO usa para determinar qual arquivo de "referência" ele precisa usar e ajustar suas configurações de EQ de acordo. O EqualizerAPO se conecta à infra-estrutura do efeito do sistema como um objeto de processamento de áudio. Tudo que eu preciso é uma solução simples que me permita alterar a linha "Include: surround.txt" para qualquer outro arquivo de EQ que eu precise usar naquele momento. Eu estou constantemente mudando entre EQs, daí a minha vinda aqui. Se possível, gostaria de receber uma lista de opções.

Por exemplo:

Select from the following equalizers:

1. Headphones
2. Surround
3. Theater
4. ***
5. ***

Enter the number:_

E saia quando o número for escolhido.

Idealmente , seria bom ter um aplicativo muito pequeno de algum tipo em execução na barra de tarefas que permita uma solução de um clique, removendo completamente o uso de arquivos em lote. No entanto, isso não é uma necessidade. Arquivos em lote são bons por enquanto.

    
por Steve 12.01.2014 / 02:43

2 respostas

1

Veja se isso ajuda. Eu tive isso de quando eu precisava executar uma pesquisa e substituir em um arquivo XML. As strings, desde que você as coloque entre aspas duplas, podem ter caracteres especiais como maior que e menor que (usados como redirecionamento por scripts, ignorados aqui) Se você não gosta do uso de variáveis para definir os arquivos quer modificar, você poderia transformá-los em argumentos que você poderia passar para o script. Mas então você teria que mudar a lógica para mudar os parâmetros a menos que você diga explicitamente "o parâmetro 1 é o arquivo a ser alterado, o parâmetro 2 é a string a ser encontrada, etc ..."

Espero que isso ajude alguém. É necessário o Windows XP ou superior.

::Find and Replace script allows the user to 
::define a file path, file name and a string 
::to find and replace so as to create a new file.
::
::Original file is backed up with an added extension of *.bak, in case
::the user finds the need to go back to the original.

@echo off
::Use the path from whence the script was executed as
::the Current Working Directory
set CWD=%~dp0

::***BEGIN MODIFY BLOCK***
::The variables below should be modified to the
::files to be changed and the strings to find/replace
::Include trailing backslash in _FilePath
set _FilePath=Path\To\File\
set _FileName=FileNameToModify
::_WrkFile is the file on which the script will make
::modifications.
set _WrkFile=BackupFileName
set OldStr="The string to be found and replaced, enclosed in double-quotes"
set NewStr="The new string to replace the value of OldStr, enclosed in double-quotes"
::***END MODIFY BLOCK***

::Set a variable which is used by the
::search and replace section to let us
::know if the string to be modified was
::found or not.
set _Found=Not found

SETLOCAL
SETLOCAL ENABLEDELAYEDEXPANSION

if not exist "%_FilePath%%_FileName%" goto :NotFound

::If a backup file exists, delete it
if exist "%_FilePath%%_WrkFile%" (
    echo Deleting "%_FilePath%%_WrkFile%" 
    del "%_FilePath%%_WrkFile%" >nul 2>&1
    )

echo.
echo Backing up "%_FilePath%%_FileName%"...
copy "%_FilePath%%_FileName%" "%_FilePath%%_WrkFile%" /v

::Delete the original file. No worries, we got a backup.
if exist "%_FilePath%%_FileName%" del "%_FilePath%%_FileName%"
echo.
echo Searching for %OldStr% string...
echo.
for /f "usebackq tokens=*" %%a in ("%_FilePath%%_WrkFile%") do (
    set _LineChk=%%a
    if "!_LineChk!"==%OldStr% (
        SET _Found=Found 
        SET NewStr=!NewStr:^"=! 
        echo !NewStr!
        ) else (echo %%a)
        )>>"%_FilePath%%_FileName%" 2>&1

::If we didn't find the string, rename the backup file to the original file name
::Otherwise, delete the _WorkFile as we re-created the original file when the
::string was found and replaced.
if /i "!_Found!"=="Not found" (echo !_Found! && del "%_FilePath%%_FileName%" && ren "%_FilePath%%_WrkFile%" %_FileName%) else (echo !_Found! && del "%_FilePath%%_WrkFile%")
goto :exit

:NotFound
echo.
echo File "%_FilePath%%_FileName%" missing. 
echo Cannot continue...
echo.
:: Pause script for approx. 10 seconds...
PING 127.0.0.1 -n 11 > NUL 2>&1
goto :Exit

:Exit
exit /b
    
por 17.01.2014 / 17:51
0

Isso deve funcionar:

$filepath = "C:\Program Files\EqualizerAPO\config\config.txt";
$equalizer = "";
$equalizers = @("Headphones","Surround","Theater");  # Add all options here.

if( -not (test-path $filepath)) 
{
    Write-Host "File: '"$filepath'" not found";
    exit(1);
}


if($args.count -gt 0)
{
    if($args[0] -ge 0 -and $args[0] -lt $equalizers.length)
    {
        $equalizer = $equalizers[[int]$args[0]];
    }
    elseif($equalizers -contains $args[0])
    {
        $equalizer = $args[0];
    }
    else
    {
        Write-Host "Invalid argument";
        exit(1);
    }
}
else
{
    Write-Host "Select from the following equalizers:";

    $i=0;

    foreach( $option in $equalizers)
    {
        Write-Host "$i. $option";
        $i++;
    }
    $choice = Read-Host "Enter choice:";

    if($choice -ge 0 -and $choice -lt $equalizers.length)
    {
        $equalizer = $equalizers[[int]$choice];
    }
    else
    {
        Write-Host "Invalid choice";
        exit(1);
    }
}

Write-Host "Changing config file to use $equalizer";

(Get-Content $filepath) | %{

    $_ -replace '^Include: .*$', ("Include: $equalizer.txt")

} | Set-Content $filepath

exit(0);

Salve como filename.ps1 e crie um arquivo bat chamado filename.cmd e coloque-os em algum lugar em seu PATH, assim você pode executar o script digitando "filename" no menu iniciar do Windows ou executar.

cole o seguinte no arquivo bat:

@echo off
if [%1]==[] goto none
powershell "& '%~dp0\filename.ps1' '%1'"
goto end
:none
powershell "& '%~dp0\filename.ps1'"
:end

PS: se você não tiver antes, certifique-se de ativar a execução de scripts do powershell:

powershell "set-executionpolicy remotesigned"
    
por 17.01.2014 / 19:38