Powershell脚本突然失败了

时间:2017-12-11 19:03:54

标签: powershell csv

我们每天在两台不同的服务器上运行一个脚本,整年都没有对脚本副本进行任何更改。上周末,服务器中断导致其中一台服务器上运行的脚本中断,并且自从该服务器上的脚本每天部分失败以来。

这是继续失败的代码,我已将其分解并在本地运行而没有问题。

$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似乎不再起作用,而脚本没有被更改,并且相同的确切脚本仍然在姐妹服务器和本地计算机上按预期运行。

有什么想法吗?

1 个答案:

答案 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 

    }