0

私は以下のコードを持っており、現在バージョン情報とサービスステータスについてコンピューターをチェックしています。

私が抱えている問題は、サーバーが別の場所にある .exe を持っていることです:

  1. C:\program files\snare\snarecore.exe
  2. C:\program files (x86)\snare\snarecore.exe
  3. D:\apps\snare\snarecore.exe

以下のスクリプトを取得して正しいバージョンを実行するにはどうすればよいですか? サービスがチェックしているパスを使用できると思いますか? 私はこれをすべてリモートで行っており、サーバーに対する権利を持っており、正常に動作していますが、実行可能ファイルの 3 つの場所すべてに基づいて 3 つ (またはそれ以上!) のスクリプトを作成する必要があります。

また、名前にスペースが含まれているファイル (../program file..) の場合、powershell が行全体を読み取り、名前のスペースが原因でエラーが発生しないようにするには、どこに引用符を付ければよいでしょうか?

コード:

clear
$ErrorActionPreference = "silentlycontinue"

$Logfile = "C:\temp\output_cdrive.log"

Function LogWrite
{
    param([string]$logstring)

    Add-Content $Logfile -Value $logstring
}

$computer = Get-Content -Path c:\temp\servers2.txt

foreach ($computer1 in $computer){

$Service = Get-WmiObject Win32_Service -Filter "Name = 'Snare'" -ComputerName $computer1

    if (test-connection $computer1 -quiet) 
    {
        $version = (Get-Command ""\\$computer1\c$\Program Files (x86)\Snare\SnareCore.exe"").FileVersionInfo.FileVersion

            if($Service.state -eq 'Running')
            {
                LogWrite "$computer1 STARTED $version"
            }
            else
            {
                LogWrite "$computer1 STOPPED $version"
            }
    }
    else 
    {
        LogWrite "$computer1 is down" -foregroundcolor RED
    }
}

ありがとう、

4

3 に答える 3

1

バックティックを使用して、二重引用符をエスケープできます。

 "`"\\$computer1\c$\Program Files (x86)\Snare\SnareCore.exe`""
于 2013-02-11T15:00:10.187 に答える
1

明らかな解決策は、パス変数を使用し、その変数を 3 つの異なるパスのそれぞれに順番に割り当て、その変数を使用して実際のチェックを関数として記述することです。

于 2013-02-11T13:15:46.287 に答える
1

サービスのパス名プロパティをチェックして、exe の場所を取得できます。

PS>(Get-WmiObject Win32_Service -Filter "name='spooler'").pathname
C:\Windows\System32\spoolsv.exe
于 2013-02-11T13:21:18.313 に答える