Estou tentando modificar um script do PowerShell para acrescentar erros em um arquivo CSV. Um ex-colega de trabalho criou um script para pegar nomes de computadores de um arquivo txt, passar pelo Active Directory e criar um arquivo CSV (cria um arquivo Excel, se isso ajudar) com as divisões resultantes e nomes canônicos. O arquivo CSV possui três colunas; “Nome”, que contém os nomes diretamente do arquivo txt; “Divisão” (retirada de “nome” no AD) que contém o nome da divisão/departamento da qual o sistema faz parte; e "CanonicalName", que contém o nome canônico completo de cada sistema conforme exibido no AD. Às vezes, um computador não terá uma entrada no AD e lançará uma mensagem de erro no host e esse sistema estará ausente do arquivo CSV. Abaixo está o script modificado,
Aqui está o que tenho atualmente:
$ComputerList = Get-Content "File Path"
$Date = Get-Date -Format dd-MM-yyyy
foreach ($Computer in $ComputerList)
{
if (@(Get-ADComputer $Computer -ErrorAction SilentlyContinue).Count) #Check if computer exists in AD
{
Get-ADComputer -Identity $Computer -Properties * | Select Name, @{n='Division'; e={([string]$_.o)}}, CanonicalName |
Export-Csv "File Path" -NoTypeInformation -Append
}
else #Annotate if computer does not exist in AD
{
$NoComputer = [PSCustomObject]
@{
Name = $Computer
Division = "Object Not Found"
CanonicalName = " "
}
$CSVData = $NoComputer | ConvertTo-Csv -NoTypeInformation
$CSVData | Select-Object -Skip 1 |
Export-Csv "File Path" -NoTypeInformation -Append #<-- Error happens on this line, according to host
}
}
Ao executar o script conforme mostrado acima, ele ainda lança a mensagem de erro no host, junto com duas colunas para cada sistema ausente que aparece a seguir (nome real do computador não mostrado por motivos de privacidade):
Name Value
---- -----
Name ComputerName
CanonicalName
Division Object Not Found
Ele também lança a seguinte mensagem de erro no host:
Export-Csv : Cannot append CSV content to the following file: File Path\Computer
Identity List.csv. The appended object does not have a property that corresponds to the following column: Name. To continue with mismatched properties, add the -Force parameter, and then
retry the command.
At File Path.ps1:36 char:8
+ Export-Csv File Path
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidData: (Name:String) [Export-Csv], InvalidOperationException
+ FullyQualifiedErrorId : CannotAppendCsvWithMismatchedPropertyNames,Microsoft.PowerShell.Commands.ExportCsvCommand
Em seguida, ele deixa de fora esse sistema no arquivo CSV, quando desejo listar o sistema e acrescentar que não foi possível encontrar o sistema com "Objeto não encontrado" na coluna "Divisão" do arquivo CSV. Tentei fazer -Force, mas apenas criou uma linha em branco. Com base no que pesquisei, isso deveria estar funcionando, mas claramente estou faltando alguma coisa. O que preciso mudar para que isso funcione?
Mude sua lógica para usar a
try / catch
em vez de anif / else
,Get-ADComputer
não respeitará o-ErrorAction
a menos que você canalize a entrada para ele. Você também beneficiará o desempenho do seu script consultando apenas os atributos de interesse (o
ecanonicalName
) em vez de todos os atributos (*
) e também construindo sua saída antes de exportá-la em vez de anexá-la.Você também cometeu um erro de digitação em sua
[PSCustomObject]
linha, a tabela hash(@{ ... }
) deve estar na mesma linha do acelerador de tipo e isso está causando o erro de incompatibilidade de propriedade quando você exporta-os para Csv, a variável$NoComputer
está recebendo o tipo atribuídoPSObject
em vez do seu real objeto.