web-dev-qa-db-ja.com

テキストファイルの行(またはWord)を編集できるバッチファイルを作成しようとしています

次のような2行を含むテキストファイル(...\config.txt)があります。

Preamp: -4 dB
Include: surround.txt

その設定ファイルで「surround」を「headphones」に変更する必要があります。私は本当に2つのバッチファイルを作成する必要があります。 1つは「ヘッドフォン」用、もう1つは「サラウンド」用です。

問題の構成ファイルは、特定のリスニング環境のEQ設定を含む別のファイルを呼び出すEqualizerAPOに関連するファイルです。上記の例では、「サラウンド」。ただし、他にも多くの場合があります。その設定ファイルは、保存されると、「include」行の下で呼び出すEQ設定を自動的にトリガーします。これが必要な理由は、リスニング環境を別のものに変更する必要がある場合は、ディレクトリを参照し、config.txtファイルを開き、必要に応じて[含める]セクションを編集してから保存する必要があるためです。必要に応じて変更しなければならないのは面倒です。ワンクリックソリューションが本当に必要です。どんな助けでも大歓迎です。ありがとうございました!

編集:

ディレクトリ(前述の「config.txt」ファイルを含む):

C:\Program Files\EqualizerAPO\config\

2種類のテキストファイルが含まれています:EQ設定ファイル(例:ヘッドフォン、サラウンド、シアターなど。基本的にユーザー作成およびTXTルームEQウィザード。これらを「参照」ファイルと呼びます。)もう1つは、EqualizerAPOが使用する必要のある「参照」ファイルを決定し、それに応じてEQ設定を調整するために使用する実際の単一構成ファイルです。EqualizerAPOはシステムに接続します。オーディオ処理オブジェクトとしてのエフェクトインフラストラクチャ。必要なのは、「Include:surround.txt」の行をその時点で使用する必要のある他のEQファイルに変更できるシンプルなソリューションだけです。EQを常に切り替えています。可能であれば、選択肢のリストを提示したいと思います。

例えば:

Select from the following equalizers:

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

Enter the number:_

そして、番号が選択されたら終了します。

理想的には、ワンクリックソリューションを可能にし、バッチファイルの使用を完全に排除する、ある種の非常に最小限のアプリケーションをタスクバーで実行するのは素晴らしいことです。ただし、それは必須ではありません。バッチファイルは当分の間問題ありません。

3
Steve

これが役立つかどうかを確認してください。これは、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
1
JSanchez

これでうまくいくはずです:

$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として保存し、filename.cmdという名前のbatファイルを作成して、両方をPATHのどこかに配置します。これにより、Windowsのスタートメニューまたは実行のいずれかに「filename」と入力してスクリプトを実行できます。

以下を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"
0
Martin