3

У меня есть текстовый файл (...\config.txt), содержащий 2 строки, который выглядит следующим образом:

Preamp: -4 dB
Include: surround.txt

Мне нужно изменить "Surround" на "наушники" в этом файле конфигурации. Мне действительно нужно сделать 2 пакетных файла. Один для "наушников" и один для "объемного звучания".

Рассматриваемый файл конфигурации - это файл, связанный с EqualizerAPO, который вызывает отдельный файл, содержащий настройки эквалайзера для конкретной среды прослушивания. В приведенном выше примере "Surround". Однако может быть много других. Этот файл конфигурации, при сохранении, автоматически запускает настройки эквалайзера, которые он вызывает, в строке "include". Причина, по которой мне это нужно, заключается в том, что, если мне нужно изменить среду прослушивания на что-то другое, мне нужно перейти в каталог, открыть файл config.txt, отредактировать раздел "Включить" в соответствии с моими потребностями, а затем сохранить. Это становится утомительным, когда я должен изменить его, когда возникает необходимость. Мне действительно нужно решение в один клик. Любая помощь будет принята с благодарностью. Спасибо!

РЕДАКТИРОВАТЬ:

Каталог (содержащий указанный выше файл «config.txt»):

C:\Program Files\EqualizerAPO\config\

содержит 2 типа текстовых файлов: файлы настроек эквалайзера (например, наушники, объемный звук, театр и т. д.). В основном файлы, которые пользователи создают и экспортируют в формате TXT с помощью программного обеспечения под названием Room EQ Wizard. Мы будем называть их "ссылочными" файлами.) Другой - это фактический единственный файл конфигурации, который EqualizerAPO использует, чтобы определить, какой "эталонный" файл ему нужно использовать, и соответствующим образом изменить его настройки эквалайзера. EqualizerAPO присоединяется к инфраструктуре системных эффектов как объект обработки звука. Все, что мне нужно, - это простое решение, которое позволило бы мне изменить строку «Include :round.txt» на любой другой файл эквалайзера, который мне нужен в данный момент. Я постоянно переключаюсь между эквалайзерами, поэтому я прихожу сюда. Если возможно, я хотел бы получить список вариантов.

Например:

Select from the following equalizers:

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

Enter the number:_

И затем выход, когда номер выбран.

В идеале было бы неплохо, чтобы на панели задач было запущено какое-то минимальное приложение, позволяющее одним щелчком мыши полностью исключить использование пакетных файлов. Однако это не является необходимостью. Пакетные файлы хороши в настоящее время.

2 ответа2

1

Посмотрите, поможет ли это. У меня было это с того момента, когда мне нужно было выполнить поиск и замену XML-файла. Строки, если вы заключаете их в двойные кавычки, могут иметь специальные символы, такие как больше и меньше чем (используется в качестве перенаправления скриптами, здесь игнорируется). Если вам не нравится использование переменных для определения файлов, которые вы хотите изменить, вы можете превратить их в аргументы, которые вы можете передать скрипту. Но тогда вам придется изменить логику для смещения параметров, если вы явно не скажете «параметр 1 - это файл, который нужно изменить, параметр 2 - это строка, которую нужно найти, и т. Д ...»

Надеюсь, это кому-нибудь поможет. Требуется Windows XP или выше.

::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
0

Это должно сделать трюк:

$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);

Сохраните как filename.ps1 и создайте файл bat с именем filename.cmd и поместите их оба где-нибудь в вашей переменной PATH, чтобы вы могли запустить сценарий, введя "filename" в меню "Пуск" Windows или в меню "Выполнить".

вставьте следующее в файл bat:

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

PS: если вы раньше этого не делали, обязательно включите запуск сценариев powershell:

powershell "set-executionpolicy remotesigned"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .