Ik wil Write-Host “\$computer\$DESTINATION\” exporteren naar de CSV-bestanden, zodat ik weet welke computers offline waren toen het script werd uitgevoerd.
Ik voer dit uit vanaf een Windows 7-machine
Antwoord 1, autoriteit 100%
Deze oplossing maakt een psobject en voegt elk object toe aan een array, waarna het de csv maakt door de inhoud van de array door Export-CSV te leiden.
$results = @()
foreach ($computer in $computerlist) {
if((Test-Connection -Cn $computer -BufferSize 16 -Count 1 -ea 0 -quiet))
{
foreach ($file in $REMOVE) {
Remove-Item "\\$computer\$DESTINATION\$file" -Recurse
Copy-Item E:\Code\powershell\shortcuts\* "\\$computer\$DESTINATION\"
}
} else {
$details = @{
Date = get-date
ComputerName = $Computer
Destination = $Destination
}
$results += New-Object PSObject -Property $details
}
}
$results | export-csv -Path c:\temp\so.csv -NoTypeInformation
Als je een string-object naar een csv pipet, wordt de lengte ervan naar de csv geschreven, dit komt omdat dit eigenschappen van de string zijn, zie hier voor meer informatie.
Daarom maak ik eerst een nieuw object.
Probeer het volgende:
write-output "test" | convertto-csv -NoTypeInformation
Dit geeft je:
"Length"
"4"
Als je Get-Member op Write-Output als volgt gebruikt:
write-output "test" | Get-Member -MemberType Property
Je zult zien dat het één eigenschap heeft – ‘length’:
TypeName: System.String
Name MemberType Definition
---- ---------- ----------
Length Property System.Int32 Length {get;}
Daarom wordt Lengte naar het csv-bestand geschreven.
Update: een CSV toevoegen
Niet de meest efficiënte manier als het bestand groot wordt…
$csvFileName = "c:\temp\so.csv"
$results = @()
if (Test-Path $csvFileName)
{
$results += Import-Csv -Path $csvFileName
}
foreach ($computer in $computerlist) {
if((Test-Connection -Cn $computer -BufferSize 16 -Count 1 -ea 0 -quiet))
{
foreach ($file in $REMOVE) {
Remove-Item "\\$computer\$DESTINATION\$file" -Recurse
Copy-Item E:\Code\powershell\shortcuts\* "\\$computer\$DESTINATION\"
}
} else {
$details = @{
Date = get-date
ComputerName = $Computer
Destination = $Destination
}
$results += New-Object PSObject -Property $details
}
}
$results | export-csv -Path $csvFileName -NoTypeInformation
Antwoord 2, autoriteit 20%
gebruik gewoon de Out-File cmd, maar vergeet niet een coderingstype op te geven:
-Encoding UTF8
dus gebruik het zo:
$log | Out-File -Append C:\as\whatever.csv -Encoding UTF8
-Toevoegen is vereist als u meer dan één keer in het bestand wilt schrijven.
Antwoord 3, autoriteit 4%
waar u naar zoekt is het Export-Csv file.csv
probeer Get-Help Export-Csv te gebruiken om te zien wat er mogelijk is
ook Out-File -FilePath "file.csv"
zal werken
Antwoord 4, autoriteit 2%
Je kunt altijd de
. gebruiken
echo "Column1`tColumn2`tColumn3..." >> results.csv
U moet “`t” tussen de kolommen plaatsen om de variabelen in hun eigen kolom te scheiden. Dit is de manier waarop ik mijn script heb geschreven:
echo "Host`tState" >> results.csv
$names = Get-Content "hostlist.txt"
foreach ($name in $names) {
$count = 0
$count2 = 13490
if ( Test-Connection -ComputerName $name -Count 1 -ErrorAction SilentlyContinue ) {
echo "$name`tUp" >> results.csv
}
else {
echo "$name`tDown" >> results.csv
}
$count++
Write-Progress -Activity "Gathering Information" -status "Pinging Hosts..." -percentComplete ($count / $count2 *100)
}
Dit is voor mij de gemakkelijkste manier. De output die ik krijg is:
Host|State
----------
H1 |Up
H2 |UP
H3 |Down
Je kunt met het uiterlijk spelen, maar dat is het basisidee. De $count is slechts een voortgangsbalk als je de look wilt opfleuren