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 {
Write-Host "\\$computer\$DESTINATION\"
}
}
我想将Write-Host“\ $ computer \ $ DESTINATION \”导出到CSV文件,以便我知道脚本运行时哪些计算机处于脱机状态。
我是从Windows 7计算机上运行的
答案 0 :(得分:27)
此解决方案创建一个psobject并将每个对象添加到一个数组中,然后通过Export-CSV管道传输数组的内容来创建csv。
$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
如果将字符串对象传递给csv,则会将其长度写入csv,这是因为这些是字符串的属性,有关详细信息,请参阅here。
这就是我首先创建一个新对象的原因。
尝试以下方法:
write-output "test" | convertto-csv -NoTypeInformation
这会给你:
"Length"
"4"
如果您在写输出上使用Get-Member,如下所示:
write-output "test" | Get-Member -MemberType Property
你会看到它有一个属性 - 'length':
TypeName: System.String
Name MemberType Definition
---- ---------- ----------
Length Property System.Int32 Length {get;}
这就是长度将写入csv文件的原因。
更新:附加CSV 如果文件变大,这不是最有效的方法......
$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
答案 1 :(得分:4)
只需使用Out-File cmd但不要忘记给出一种编码类型:
-Encoding UTF8
所以请使用它:
$log | Out-File -Append C:\as\whatever.csv -Encoding UTF8
如果您想多次写入文件,则需要-Append。
答案 2 :(得分:2)
您要搜索的是Export-Csv file.csv
尝试使用Get-Help Export-Csv来查看可能的内容
Out-File -FilePath "file.csv"
也可以
答案 3 :(得分:1)
您可以随时使用
echo "Column1`tColumn2`tColumn3..." >> results.csv
您需要在列之间放置“`t”以将变量分隔到它们自己的列中。这是我编写脚本的方式:
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)
}
这对我来说是最简单的方法。我得到的输出是:
Host|State
----------
H1 |Up
H2 |UP
H3 |Down
你可以玩看看,但这是基本的想法。 $ count只是一个进度条,如果你想增加外观