Windowsでホストファイルにレコードを追加するにはバッチファイルが必要ですが、このレコードが既に存在するかどうかを確認したいので、ファイルの追加書き込みだけは必要ありません。可能ですか?
3 に答える
うーん、それはトリッキーです。
私が最初に言うことは、バッチファイルでこれをやろうとすることを忘れることです.
バッチ ファイルだけでは、外部ツールを使用しない限り、このようなことを行う力がありません。
確かに可能ですが、どのコマンド ライン ツールをインストールする必要があるか、および適切な組み合わせを見つけるために際限なく実験する方法を正確に把握していない限り.
ただし、このルートに進みたい場合は、sourceforge の GnuWin32 プロジェクトを参照することをお勧めします。ここでは、すべての標準の UNIX コマンド ライン ツールが Windows に移植されており、Sed、Grep、Awk などが含まれています。それはあなたがやろうとしていることに最適です。
ただし、Powershell の使用を検討することを強くお勧めします。.NET の経験があれば、C# でコマンド ライン ツールを使用することをお勧めします。
頭のてっぺんからPowerShellの例を思いつくことはできませんが、C#で次のようにすることができます:
using System;
using System.Collections.Generic;
using System.IO;
class Program
{
static void Main()
{
const string filename = "path\to\your\hosts\file";
List<string> lines = new List<string>();
using (StreamReader reader = new StreamReader(filename))
{
string line;
while ((line = reader.ReadLine()) != null)
{
lines.Add(line);
}
}
string newLineToAdd = "127.0.0.1 somedomain.com"
bool found = false;
foreach(string line in lines)
{
if(line.Equals(newLineToAdd))
{
found = true;
}
}
if(!found)
{
lines.Add(newLineToAdd);
}
using (StreamWriter writer = new StreamWriter(filename))
{
foreach(string line in lines())
{
writer.WriteLine(line);
}
}
}
}
これは完全な例ではないことに注意してください。私は確かにそれをテストコンパイルする時間がありませんでしたが、理論的には(選択した言語に関係なく)行う必要があるのは次のとおりです。
1) ファイルのすべての行を配列にロードします。 2) 配列チェックの各行をスキャンして、追加する行と等しいかどうかを確認します。 3) 配列にまだ存在しない場合は、新しい行をarray 4) 配列内のすべての行をディスクに書き戻し、古いファイルを完全に上書きします。
私の例について注意すべき点がいくつかあります。
1) 私はすべてをハード コードしました。いくつかのパラメーターを渡す必要があります (残念ながら、現時点では完全な機能のサンプルを入力する時間がありません)。
2) ホスト ファイルの変更には管理者権限が必要です。したがって、管理者として実行するようにマークされたショートカットからプログラムを実行するか、.NET プロジェクトをコンパイルして管理者プログラムとして実行するように設定する必要があります。 WindowsでUAC機能を使用するために、コードを追加します。(最初の方法が最も速くて簡単です)
ただし、ここでの私のメモが正しい方向への出発点になることを願っています。
後で時間ができたら(そして覚えています....)戻ってきて、もう少し改善できるかどうかを確認します。