私たちは、特定した (そして手動で修正できる) 不正な構成ファイルを、すべてのユーザーの appdata フォルダーから排除したいと考えています。構成ファイルはあちこちにしか存在せず、すべてのユーザーに存在するわけではありません。そこで、config.xml の get-content で指定したテキストが一致した場合に true/false を返すスクリプトを作成しようとしています。これをすべてのマシンの各ユーザー プロファイルに対して実行し、結果を csv に出力したいと考えています。
今のところ、問題が発生しています。まだ PowerShell を学習中なので、助けていただければ幸いです。
$Users = "C:\Users"
$x = "This is the text I'm looking for"
Foreach ($Username in $Users)
{
$Path = "$Users\$Username\AppData\Local\MyApp\Settings\Config.xml"
$y = Get-Content -Path $Path
If ($y -match $x)
{
"true"
}
else
{
"false"
}
}
ご覧のとおり、get-content を生成するための正しいパスを取得できないため、まだ csv 部分には到達していません。
foreach ループが実行されるときに期待していた正しいパスは次のようになります。
"C:\Users\Username1\AppData\Local\MyApp\Settings\Config.xml"
"C:\Users\Username2\AppData\Local\MyApp\Settings\Config.xml"
"C:\Users\Username3\AppData\Local\MyApp\Settings\Config.xml"
代わりに次のエラーが表示されます:
Get-Content : Cannot find path 'C:\Users\C:\Users\AppData\Local\MyApp\Settings\Config.xml' because it does not exist.
At C:\Users\mastaxx\Desktop\test.ps1:9 char:6
+ $y = Get-Content -Path $Path
+ ~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\Users\C:\Use...ings\Config.xml:String) [Get-Content], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand
ここでの私の一見ばかげた仮定は、$Users は"C:\Users"
(私が定義したのでそうだと思います)、$Username は (明らかにそうではありませんが) であるということです。しかし、この場合もそうであり、構築されるパスが次のように間違っていることが"Username1"
わかります。"C:\Users"
C:\Users\C:\Users\AppData\Local\MyApp\Settings\Config.xml
$Users
foreach ループが各フォルダーを個別のオブジェクトとして扱い、各ループのインスタンスになり、次のように$Username
構成ファイルに挿入できるようになると予想しました。$path
$Users $Username
↓ ↓
C:\Users\Username1\AppData\Local\MyApp\Settings\Config.xml
何が間違っているのかよく分かりませんが、間違いなく何かおかしなことをしていると思います。PS スキルに詳しい方がいれば、指摘していただけると助かります。
答え1
方程式に Get-Childitem が欠けていたことが判明しました。
これは正しい方法ですが、私の PS には大幅な改善が必要なことは確かです。適切にフォーマットされた CSV をエクスポートできなかったため、true の各インスタンスごとに個別の CSV を出力するという面倒なアプローチを選択しましたが、少なくともうまく機能しています。
$computers = Get-Content -Path "C:\computers.txt"
foreach ($comp in $computers) {
$i = "\\$comp\C$\Users\"
$AppData = "\AppData\Local\MyApp\Settings\Config.xml"
$text = "Text I'm Looking For*"
Get-ChildItem -Path $i
Foreach ($folder in Get-Childitem $i)
{
$ReadConfig = Get-Content -Path "$i$folder$AppData"
If ($ReadConfig -match $text)
{
out-file "c:\results\$comp $folder.csv"
}
else
{
"false"
}
}
}