我有一个表,其中包含指向存储在文件服务器上的文件的信息。我正在尝试编写一个powershell脚本来验证表中的每个记录是否都有一个与服务器上的相关的物理文件,如果它没有写入CSV文件。我对csv部分没什么好运,希望你能帮忙吗?
这是我到目前为止(请告诉我是否有更好的方法来做到这一点,我是PowerShell的新手)。如果测试路径无法找到有问题的文件,我只想将记录添加到csv。
[Reflection.Assembly]::LoadFile("C:\ora10g\odp.net\bin\2.x\Oracle.DataAccess.dll")
$connectionString = "Data Source=XXXXXX;User Id=XXXX;Password=XXXXXXXX;"
$connection = New-Object Oracle.DataAccess.Client.OracleConnection($connectionString)
$connection.Open()
$queryString = "SELECT Key, Sequence, Type, File FROM FileTable WHERE Type IN (2, 5)"
$command = new-Object Oracle.DataAccess.Client.OracleCommand($queryString, $connection)
$mediaObjRS = $command.ExecuteReader()
# Loop through recordset
while ($mediaObjRS.read()) {
# Assign variables from recordset.
$objectKey = $mediaObjRS.GetString(0)
$objectSeq = $mediaObjRS.GetDecimal(1)
$objectType = $mediaObjRS.GetDecimal(2)
$objectFileName = $mediaObjRS.GetString(3)
# Check if file exists based on filetype.
if($objectType -eq 2){
# Type 2 = OLE
$fileLocation = "\\fileserver\D$\files\" + $objectFileName
}elseif($objectType -eq 5){
# Type 5 = FILE
$fileLocation = $objectFileName
}
$fileExists = Test-Path $fileLocation
if($fileExists -eq $False){
#Write to output file
$objectKey | Export-Csv missingfiles.csv
$objectSeq | Export-Csv missingfiles.csv
$objectType | Export-Csv missingfiles.csv
$objectFileName | Export-Csv missingfiles.csv
}
}
$connection.Close()
答案 0 :(得分:1)
每次你写下missingfiles.cs都会破坏前一个。此外,此cmdlet面向保存对象,其中每个属性表示逗号分隔值之一。
最简单的方法是手动编写(追加)到csv文件:
if(!$fileExists) {
#Write to output file
"`"$objectKey`",`"$objectSeq`",`"$objectType`",`"$objectFileName`" >> foo.csv
}
“光滑”的PowerShell方法是为每个文件创建一个对象,然后将它们放在一个数组中,完成后,将该对象数组导出为CSV文件,例如:
$files = @() # Initialize array outside loop
...
if (!$fileExists) {
$obj = new-object -psobject -prop @{
Key = $objectKey
Seq = $objectSeq
Type = $objectType
FileName = $objectFileName
}
$files += obj
}
...
# outside of loop, export array of objects to csv
$files | Export-Csv missingfiles.csv