Chcesz utworzyć plik wsadowy umożliwiający edycję linii (lub słowa) w pliku tekstowym

3

Mam plik tekstowy (... \ config.txt) zawierający 2 linie, które wyglądają jak:

Preamp: -4 dB
Include: surround.txt

Muszę zmienić „surround” na „słuchawki” w tym pliku konfiguracyjnym. Naprawdę muszę utworzyć 2 pliki wsadowe. Jeden dla „słuchawek” i jeden dla „surround”.

Plik konfiguracyjny, o którym mowa, to plik związany z EqualizerAPO, który wywołuje osobny plik zawierający ustawienia EQ dla konkretnego środowiska nasłuchującego. W powyższym przykładzie „surround”. Jednak może być wiele innych. Ten plik konfiguracyjny po zapisaniu automatycznie wyzwala ustawienia EQ, które wywołuje pod linią „include”. Potrzebuję tego dlatego, że jeśli muszę zmienić środowisko nasłuchiwania na coś innego, muszę przejść do katalogu, otworzyć plik config.txt, edytować sekcję „Dołącz” do moich potrzeb, a następnie zapisać. To staje się nużące, kiedy muszę to zmienić, kiedy zajdzie taka potrzeba. Naprawdę potrzebuję rozwiązania jednym kliknięciem. Każda pomoc byłaby bardzo mile widziana. Dziękuję Ci!

EDYTOWAĆ:

Katalog (zawierający wspomniany wcześniej plik „config.txt”):

C:\Program Files\EqualizerAPO\config\

zawiera 2 rodzaje plików tekstowych: pliki ustawień EQ (np. słuchawki, surround, teatr itp. Zasadniczo pliki, które użytkownicy tworzą i eksportują w formacie TXT za pomocą oprogramowania o nazwie Room EQ Wizard. Nazwiemy je plikami „referencyjnymi”). innym jest rzeczywisty pojedynczy plik konfiguracyjny, którego używa EqualizerAPO w celu ustalenia, który plik „referencyjny” musi użyć, i odpowiednio dostosuj jego ustawienia EQ. EqualizerAPO przyłącza się do infrastruktury efektów systemowych jako Obiekt Przetwarzania Audio. Potrzebuję tylko prostego rozwiązania, które pozwoliłoby mi zmienić wiersz „Include: surround.txt” na dowolny inny plik EQ, którego potrzebuję w tym czasie. Ciągle zmieniam EQ, stąd moje przybycie tutaj. Jeśli to możliwe, chciałbym przedstawić listę opcji do wyboru.

Na przykład:

Select from the following equalizers:

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

Enter the number:_

A następnie wyjdź po wybraniu numeru.

Idealnie byłoby, gdyby na pasku zadań działała jakaś minimalna aplikacja, która pozwala na rozwiązanie jednym kliknięciem, całkowicie eliminując użycie plików wsadowych. Nie jest to jednak konieczne. Pliki wsadowe są na razie w porządku.

Steve
źródło
I really need to make 2 batch files. One for "headphones" and one for "surround"Co masz na myśli ? Plik wsadowy zmienić surroundsię headphonesi inny plik wsadowy zmienić headphonessię surround? I wreszcie, czy partia jest obowiązkowa, czy PowerShell jest dostępną opcją?
user2196728,
4
Dlaczego nie zrobić 2 kopii pliku config.txt i config-2.txt i po prostu zmienić ich nazwę w razie potrzeby?
cybernard
+1 do cybernarda! W ten sposób Twoje pliki wsadowe będą po prostu używać rename:) łatwe!
user2196728,
@ user2196728 Zredagowałem OP w celu wyjaśnienia. „Plik wsadowy do zmiany dźwięku przestrzennego na słuchawki i inny plik wsadowy do zamiany dźwięku surround na słuchawki?” To jest poprawne. Jeśli chodzi o PowerShell, użyłem go tylko raz lub dwa razy wcześniej, ale nie widzę problemu z
Steve
Jeśli chodzi o sugestię cybernard - wymaga co najmniej 2 RENAME na zmianę. Zamiast tego sugeruję użycie jednego KOPIOWANIA. Więc możesz mieć słuchawki.txt i surround.txt i po prostu skopiuj jeden z nich do config.txt w razie potrzeby.
dbenham

Odpowiedzi:

1

Sprawdź, czy to pomoże. Miałem to od momentu, gdy musiałem przeprowadzić wyszukiwanie i zamienić plik XML. Ciągi, o ile są ujęte w cudzysłowy, mogą mieć znaki specjalne, takie jak większe i mniejsze niż (używane jako przekierowanie przez skrypty, tutaj ignorowane). Jeśli nie podoba ci się używanie zmiennych do definiowania plików, które chcesz zmodyfikować, możesz przekształcić je w argumenty, które możesz przekazać do skryptu. Ale wtedy musiałbyś zmienić logikę, aby przesunąć parametry, chyba że wyraźnie powiesz „parametr 1 to plik, który chcesz zmienić, parametr 2 to ciąg, który należy znaleźć itp.”

Mam nadzieję, że to komuś pomoże. Wymagany jest system Windows XP lub nowszy.

::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
JSanchez
źródło
0

To powinno załatwić sprawę:

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

Zapisz jako nazwa_pliku.ps1 i utwórz plik nietoperza o nazwie nazwa_pliku.cmd i umieść je gdzieś w ŚCIEŻCE, w ten sposób możesz uruchomić skrypt, wpisując „nazwa_pliku” w menu Start systemu Windows lub uruchom.

wklej następujące elementy do pliku nietoperza:

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

PS: jeśli jeszcze tego nie zrobiłeś, pamiętaj o włączeniu uruchamiania skryptów PowerShell:

powershell "set-executionpolicy remotesigned"
Jaskółka oknówka
źródło
Na początku pytania należy stwierdzić, że poniższy kod nie jest plikiem wsadowym. oprócz 7 linii na końcu
barlop