teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

PS v2 に対応した方法へ変更(テキスト取得方法、ホスト名取得)

2019/06/13 12:58

投稿

mitarai
mitarai

スコア223

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=" + [Net.Dns]::GetHostName()
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 | Get-Content -Encoding utf8
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ファイルのコピーを省略した

2019/06/13 12:58

投稿

mitarai
mitarai

スコア223

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" = "Server=$ip"
31
+ "Server=127.0.0.1" = "Server=$ip"
32
- "ServerActive=127.0.0.1" = "ServerActive=$ip"
32
+ "ServerActive=127.0.0.1" = "ServerActive=$ip"
33
- "Hostname=Windows host" = "Hostname=" + [Net.Dns]::GetHostName()
33
+ "Hostname=Windows host" = "Hostname=" + [Net.Dns]::GetHostName()
34
- "# HostMetadata=" = "# HostMetadata=rnrnHostMetadata=$metaData"
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") | Join-Path -ChildPath zabbix_agents.zip
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($zipFile.FullName)
80
+ $srcNS = $shell.NameSpace($zipPath)
85
- $destNS = $shell.NameSpace($zipFile.DirectoryName)
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
- $zipFile,"$destDir/bin","$destDir/conf" | Remove-Item -Recurse
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

微修正

2019/06/12 15:48

投稿

mitarai
mitarai

スコア223

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
- ただしこのような正規表現が必要ない単純な置換は`-replace`演算子を使うと無駄にコストがかかるので
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 $confFile -Encoding utf8
39
+ $conf | Out-File sample.conf -Encoding utf8
40
40
  ```
41
41
  この辺りはいろいろなやり方があると思うので自分が良いと思う方法でやってください。単純に
42
42
  `"abcde".Replace("a","x").Replace("b","y")・・・`とつなげてもいいです。