Ошибка вызова New-Item в цикле из данных CSV

Прежде чем мы перейдем к коду, у меня есть CSV со списком компьютеров и только 1 столбец. Цель состоит в том, чтобы использовать информацию из столбца A, помеченную как "Компьютеры", и получить все службы для этих компьютеров и вывести их в папки, созданные на основе информации из столбца A. Вот сценарий на данный момент:

Import-Module activedirectory
$Group=import-csv C:\Users\axb3055\Documents\CSV_Test.csv 
$ServiceList = Test-Path C:\ServiceList
if($ServiceList -eq $true)
{Write-Host "Service List Exists"}
else
{
Write-Host "Creating ServiceList folder"
New-Item C:\ServiceList\$CompName -ItemType directory -ErrorActionSilentlyContinue | Out-Null
}
$Group | foreach {$CompName = $_.Computers New-Item -Path C:\ServiceList\$CompName -ItemType directory | Get-Service -ComputerName  $_.Computers} | Out-File C:\ServiceList\$CompName\$CompName.txt

Сейчас происходит то, что папка Service List создается, но после этого ничего не происходит. Я получаю сообщение об ошибке "New-Item" в блоке for-each, но я не уверен, что это может быть. Есть идеи?

2 ответа

Решение

Я бы начал устранять неполадки, разбив ваши заявления о трубопроводах. Распечатайте значения по всей последовательности, чтобы увидеть, есть ли у вас нулевые значения, и внесите соответствующие изменения.

Import-Module activedirectory
    $Group=import-csv C:\Users\axb3055\Documents\CSV_Test.csv 
    $ServiceList = Test-Path C:\ServiceList
    if($ServiceList -eq $true)
    {
    Write-Host "Service List Exists"
    }
    else
    {
    Write-Host "Creating ServiceList folder"
    New-Item C:\ServiceList\$CompName -ItemType directory -ErrorActionSilentlyContinue | Out-Null
    }

    foreach ($CompName in $Group.Computers){
     #create file
     New-Item -Path C:\ServiceList\$CompName -ItemType directory 
     #get service and assign to variable
     $service = Get-Service -ComputerName $CompName
     #output the service content to the textfile
     Out-File C:\ServiceList\$CompName\$CompName.txt -value $service        
    }

Есть некоторые возможности для улучшения. Ваша непосредственная проблема заключается в том, что вы не отделяете New-Item Командлет из кода вокруг него. Используйте правильные отступы и новые строки. Однострочники бесполезны, если страдают функциональность и читаемость.

$Group = Import-Csv "C:\Users\axb3055\Documents\CSV_Test.csv" 
$serviceListPath = "C:\ServiceList"
if(Test-Path $serviceListPath){
    Write-Host "Service List Exists"
} else {
    Write-Host "Creating ServiceList folder"
    New-Item C:\ServiceList -ItemType directory | Out-Null
}

# Gather info and place int file
ForEach($computer in ($Group.Computers)){
    # Define output folder for this computer
    $outputFolder = "$serviceListPath\$computer"
    $outputFile = "$outputFolder\$computer.csv"
    # Create the output folder if it does not already exist.
    if(!(Test-Path $outputFolder)){New-Item -Path $outputFolder -ItemType directory | Out-Null}
    # Output Service information to file.
    Get-Service -ComputerName $computer | Select-Object Status,Name,DisplayName | Export-CSV -NoTypeInformation $outputFile
}

Это должно проверить сервисы каждого компьютера и записать результаты в виде CSV, каждый в своей папке.

Другие вопросы по тегам