我们每天在两台不同的服务器上运行一个脚本,整年都没有对脚本副本进行任何更改。上周末,服务器中断导致其中一台服务器上运行的脚本中断,并且自从该服务器上的脚本每天部分失败以来。
这是继续失败的代码,我已将其分解并在本地运行而没有问题。
$rawlineCountFile ="C:\temp\files\test\linecount"
$rawlineCountFile = $rawlineCountFile +'RawlineCount' + 'test' + '.csv'
$filePath = "C:\temp\files\test"
# do line count in files
$bak = Get-ChildItem $filePath | Where-Object { $_.Extension -eq ".dat" }
Try
{
Write-Output "line_count , file_name"
foreach ($file in $bak) {
$name = $file.name
$measure =(Get-Content $filePath\$file | Measure-Object)
$lines = $measure.Count
Write-Output "$lines , $name"
Write-Output "$lines , $name" >> $rawlineCountFile
}
} catch [Exception] {
Write-Output $_.Exception.GetType().FullName
Write-Output $_.Exception.Message
}
上面的脚本查看带有.dat文件和FOR EACH文件的文件夹,它将每个文件($ measure.count)中的$行和$ file.name写入rawlinecountfile.csv。
即。
123,file1.dat
234,file2.dat
987,file3.dat
567,file4.dat
等。等
每天都有7个文件移入此文件夹,然后运行此脚本,因此每天应该有7行添加到rawlinecount文件中,然后在剩余的进程完成后,所有文件都被清除准备第二天。
然而,自上周中断以来,它每天只将7行中的0-2写入csv文件,而不是FOR EACH文件(仍为7)。
我们很难理解为什么For Each似乎不再起作用,而脚本没有被更改,并且相同的确切脚本仍然在姐妹服务器和本地计算机上按预期运行。
有什么想法吗?
答案 0 :(得分:0)
当您致电Get-Content
时,我相信您正在尝试从C:\Temp\Files\Test\C:\Temp\Files\Test\Filename.dat
获取该文件。您可以使用$file.FullName
获取完整路径。我怀疑它可能会抛出错误而不是将内容添加到文件中。这适用于PS 5.1。
$rawlineCountFile ="C:\temp\files\test\linecount"
$rawlineCountFile = $rawlineCountFile +'RawlineCount' + 'test' + '.csv'
$filePath = "C:\temp\files\test"
# do line count in files
$bak = Get-ChildItem $filePath | Where-Object { $_.Extension -eq ".dat" }
Try
{
Write-Output "line_count , file_name"
foreach ($file in $bak)
{
$name = $file.name
$lines = @(Get-Content -Path $File.FullName).Count
Write-Output "$lines , $name"
"$lines , $name" | Add-Content $rawlineCountFile
}
}
catch [Exception]
{
Write-Output $_.Exception.GetType().FullName
Write-Output $_.Exception.Message
}
更换我提到的单行可能是一个问题:
$rawlineCountFile ="C:\temp\files\test\linecount"
$rawlineCountFile = $rawlineCountFile +'RawlineCount' + 'test' + '.csv'
$filePath = "C:\temp\files\test"
# do line count in files
$bak = Get-ChildItem $filePath | Where-Object { $_.Extension -eq ".dat" }
Try
{
Write-Output "line_count , file_name"
foreach ($file in $bak) {
$name = $file.name
$measure =(Get-Content $file.FullName | Measure-Object)
$lines = $measure.Count
Write-Output "$lines , $name"
Write-Output "$lines , $name" >> $rawlineCountFile
}
} catch [Exception] {
Write-Output $_.Exception.GetType().FullName
Write-Output $_.Exception.Message
}