回答編集履歴
3
PS v2 に対応した方法へ変更(テキスト取得方法、ホスト名取得)
answer
CHANGED
@@ -43,8 +43,20 @@
|
|
43
43
|
|
44
44
|
あと置換の度にファイルに保存して、また読み込んで、を繰り返すのは無駄なので変数内で繰り返し置換したあとに最後に保存するとよいと思います。
|
45
45
|
|
46
|
+
#### 追記
|
46
|
-
|
47
|
+
上記の配列に対してその要素のメソッドを呼び出す方法はPowerShell version 2ではできない方法でしたので、一括して読み込む方法を使うとよいです。
|
48
|
+
```PowerShell
|
49
|
+
# これを
|
50
|
+
$conf = Get-Content sample.conf -Encoding utf8
|
51
|
+
↓
|
52
|
+
# こっちに変更
|
53
|
+
$conf = [IO.File]::ReadAllText(sample.conf, [Text.Encoding]::UTF8)
|
54
|
+
```
|
55
|
+
こうすることで文字列の配列ではなく一つの文字列としてファイルを読み込みます。
|
47
56
|
|
57
|
+
|
58
|
+
最後に全体的に手直しして少し見通しをよくしたコードを置いて置きます。まったくテストしてないのでバグがあったらすみません。ご参考までに。(こちらも修正しました)
|
59
|
+
|
48
60
|
```PowerShell
|
49
61
|
$ip = "..."
|
50
62
|
$logPath = "c:\zabbix\zabbix_agentd.log"
|
@@ -62,7 +74,7 @@
|
|
62
74
|
"LogFile=c:\zabbix_agentd.log" = "LogFile=$logPath"
|
63
75
|
"Server=127.0.0.1" = "Server=$ip"
|
64
76
|
"ServerActive=127.0.0.1" = "ServerActive=$ip"
|
65
|
-
"Hostname=Windows host" = "Hostname=" +
|
77
|
+
"Hostname=Windows host" = "Hostname=" + (hostname)
|
66
78
|
"# HostMetadata=" = "# HostMetadata=rnrnHostMetadata=$metaData"
|
67
79
|
}
|
68
80
|
|
@@ -87,7 +99,7 @@
|
|
87
99
|
$confFile = Move-Item "$destDir/conf/$confName" $destDir -PassThru
|
88
100
|
|
89
101
|
#confファイル書き換え
|
90
|
-
$conf = $confFile
|
102
|
+
$conf = [IO.File]::ReadAllText($confFile, [Text.Encoding]::UTF8)
|
91
103
|
$h.GetEnumerator() | foreach { $conf = $conf.Replace($_.Key, $_.Value) }
|
92
104
|
$conf | Out-File $confFile -Encoding utf8
|
93
105
|
|
2
zipファイルのコピーを省略した
answer
CHANGED
@@ -28,10 +28,10 @@
|
|
28
28
|
```PowerShell
|
29
29
|
$h = @{
|
30
30
|
"LogFile=c:\zabbix_agentd.log" = "LogFile=$logPath"
|
31
|
-
"Server=127.0.0.1"
|
31
|
+
"Server=127.0.0.1" = "Server=$ip"
|
32
|
-
"ServerActive=127.0.0.1"
|
32
|
+
"ServerActive=127.0.0.1" = "ServerActive=$ip"
|
33
|
-
"Hostname=Windows host"
|
33
|
+
"Hostname=Windows host" = "Hostname=" + [Net.Dns]::GetHostName()
|
34
|
-
"# HostMetadata="
|
34
|
+
"# HostMetadata=" = "# HostMetadata=rnrnHostMetadata=$metaData"
|
35
35
|
}
|
36
36
|
|
37
37
|
$conf = Get-Content sample.conf -Encoding utf8
|
@@ -52,7 +52,7 @@
|
|
52
52
|
|
53
53
|
##### ここから本文 ######
|
54
54
|
|
55
|
-
$zipPath = [Environment]::GetFolderPath("Desktop")
|
55
|
+
$zipPath = Join-Path ([Environment]::GetFolderPath("Desktop")) "zabbix_agents.zip"
|
56
56
|
$destDir = "C:\zabbix"
|
57
57
|
$exeName = "zabbix_agentd.exe"
|
58
58
|
$confName = "zabbix_agentd.conf"
|
@@ -68,21 +68,17 @@
|
|
68
68
|
|
69
69
|
#スクリプト出力ログ
|
70
70
|
$scriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent
|
71
|
-
Write-Host $scriptRoot
|
72
71
|
Start-Transcript -Path "$scriptRoot/zabbixAgentインストール.log"
|
73
72
|
|
74
73
|
#### 処理開始 ####
|
75
74
|
|
76
75
|
#フォルダ作成
|
77
|
-
New-Item $destDir -ItemType Directory
|
76
|
+
New-Item $destDir -ItemType Directory > $null
|
78
77
|
|
79
|
-
#zipファイル移動
|
80
|
-
$zipFile = Move-Item $zipPath $destDir -PassThru
|
81
|
-
|
82
78
|
#解凍
|
83
79
|
$shell = New-Object -ComObject shell.application
|
84
|
-
$srcNS = $shell.NameSpace($
|
80
|
+
$srcNS = $shell.NameSpace($zipPath)
|
85
|
-
$destNS = $shell.NameSpace($
|
81
|
+
$destNS = $shell.NameSpace($destDir)
|
86
82
|
$destNS.CopyHere($srcNS.Items())
|
87
83
|
|
88
84
|
#exeファイル配置
|
@@ -95,7 +91,6 @@
|
|
95
91
|
$h.GetEnumerator() | foreach { $conf = $conf.Replace($_.Key, $_.Value) }
|
96
92
|
$conf | Out-File $confFile -Encoding utf8
|
97
93
|
|
98
|
-
|
99
94
|
#ZabbixAgentサービス開始
|
100
95
|
& $exeFile -i -c $confFile
|
101
96
|
#スタートアップの種類:手動
|
@@ -107,7 +102,7 @@
|
|
107
102
|
Set-Service -Name 'Zabbix Agent' -StartupType Automatic
|
108
103
|
|
109
104
|
#zipファイル,binフォルダ,confフォルダ削除
|
110
|
-
$
|
105
|
+
$zipPath,"$destDir/bin","$destDir/conf" | Remove-Item -Recurse
|
111
106
|
|
112
107
|
#起動確認
|
113
108
|
Get-Service "Zabbix Agent" | Select-Object DisplayName,Status,StartType,PathName
|
1
微修正
answer
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
`-replace`演算子は正規表現によって置換します。
|
2
|
-
正規表現においてカンマ`.`やバックスラッシュ`\`などは特別な意味をもつので文字通りにマッチしなかったのが原因
|
2
|
+
正規表現においてカンマ`.`やバックスラッシュ`\`などは特別な意味をもつので文字通りにマッチしなかったのが原因かと思われます。
|
3
3
|
|
4
4
|
例として以下のようにしても置換されませんが
|
5
5
|
```PowerShell
|
6
6
|
"c:\test.txt" -replace "c:\test.txt", "Matched!"
|
7
7
|
c:\test.txt
|
8
8
|
```
|
9
|
-
特別な意味をもつ記号
|
9
|
+
特別な意味をもつ記号をエスケープしてやればマッチします。
|
10
10
|
```PowerShell
|
11
11
|
"c:\test.txt" -replace "c:\test.txt", "Matched!"
|
12
12
|
Matched!
|
@@ -18,7 +18,7 @@
|
|
18
18
|
|
19
19
|
```
|
20
20
|
|
21
|
-
ただしこのような正規表現が必要ない
|
21
|
+
ただしこのような正規表現が必要ない場合は`-replace`演算子を使うと無駄にコストがかかるので
|
22
22
|
`"文字列".Replace("置換前", "置換後")`メソッドを使って単純な置換を行うのが普通です。
|
23
23
|
|
24
24
|
```PowerShell
|
@@ -36,7 +36,7 @@
|
|
36
36
|
|
37
37
|
$conf = Get-Content sample.conf -Encoding utf8
|
38
38
|
$h.GetEnumerator() | foreach { $conf = $conf.Replace($_.Key, $_.Value) }
|
39
|
-
$conf | Out-File
|
39
|
+
$conf | Out-File sample.conf -Encoding utf8
|
40
40
|
```
|
41
41
|
この辺りはいろいろなやり方があると思うので自分が良いと思う方法でやってください。単純に
|
42
42
|
`"abcde".Replace("a","x").Replace("b","y")・・・`とつなげてもいいです。
|