У меня есть следующий сценарий.
Get-Content comps.csv | Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -recurse | Get-ItemProperty -name Version,Release -EA 0 | Where { $_.PSChildName -match '^(?!S)\p{L}'} | Select PSChildName, Version, Release
Мой контент comps.csv
Name,Type,Description,
ALYTAUS-PC,Computer,,
AUGUSTE-PC,Computer,,
AUSRA-PC,Computer,,
BIRZU-PC,Computer,,
VYTAUTO-PC1,Computer,,
Я получил это сообщение для каждого объекта в csv:
Get-ChildItem : The input object cannot be bound to any parameters for the command either because the command does n
ot take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.
At line:1 char:38
+ Get-Content comps.csv | Get-ChildItem <<<< 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -recurse |
+ CategoryInfo : InvalidArgument: (VYTAUTO-PC1,Computer,,:PSObject) [Get-ChildItem], ParameterBindingE
xception
+ FullyQualifiedErrorId : InputObjectNotBound,Microsoft.PowerShell.Commands.GetChildItemCommand
Get-ChildItem ждет дорожка из конвейера, а не имя компьютера. Первое, что вам нужно, это получить объект компьютера с его атрибутами (имя, тип, описание) из файла CSV:
Get-Content -Path "c:\temp\servers.csv" | ConvertFrom-Csv | ForEach-Object -Process {
Write-Host "Server name: " -NoNewline
Write-Host $_.Name
}
Далее вам нужно выполнить команды удаленно с помощью Invoke-Command:
Invoke-Command -ComputerName $_.Name -ScriptBlock {
Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP'
}
В заключение:
Get-Content -Path "c:\temp\servers.csv" | ConvertFrom-Csv | ForEach-Object -Process {
Invoke-Command -ComputerName $_.Name -ScriptBlock {
Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP'
}
}
Чтобы запустить блок скрипта с указанными учетными данными, используйте параметр -Credential в Invoke-Command.