【问题标题】:Powershell script listening for filesPowershell脚本监听文件
【发布时间】:2017-11-20 08:32:47
【问题描述】:

我有一个执行以下操作的 Powershell 脚本:

 # Lists txt files, remove 'newline' in files, move them to another folder

 $files = @(Get-ChildItem c:\temp\*.txt)
 $outputfolder = "c:\temp\fixed"

        foreach ($file in $files) 
                {
                (Get-Content $file -Raw) -replace "`n",'' | Set-Content $file
                Move-Item $file $outputfolder
                }

现在我想添加一些 while 循环(或其他例程),目的是让脚本保持清醒并监听要处理的新文件。当在c:\temp 文件夹中检测到新的传入文件时,脚本应自动处理它们。也许可以使用一些“睡眠”命令来实现,每 5 秒检查一次目录。

有什么好的建议吗?

【问题讨论】:

  • 我喜欢“-2”票,但没有解释为什么?我认为这是一个很好的问题,除了缺少“我尝试过 X、Y 和 Z,但它们没有奏效”。也许他只是不知道从哪里开始,我也不知道!一直关注这个,这样我就可以知道是否提供了答案。
  • 谢谢@RossLyons,我同意你的看法。这不是第一次有人在没有任何解释的情况下投反对票。顺便说一句,我不在乎选票。我找到了自己的解决方案,我将发布它以造福所有人,这是任何论坛的精神。谢谢你的话。

标签: powershell powershell-2.0 powershell-3.0


【解决方案1】:

这样做的基本方法是:

while ($true) {

    # Your script here

    Start-Sleep -Seconds 5;
}

下一个方法只是稍微复杂一些。您可以将脚本保存到 .ps1 文件,然后使用 Windows 任务计划程序每 5 秒运行一次脚本。

这两种方法都非常基本,因此可以合理地期望您应该已经了解它们,并且不解释您为什么不使用它们可能是您被否决并获得接近投票的原因。

第三种选择是使用System.IO.FileWatcherRegister-ObjectEvent。这个选项相当先进。在StackOverflowelsewhere 上有示例。这样做的优点是资源密集度更低,但缺点是因为您使用的是用于创作服务的方法,所以有点像使用钉枪打钉子。

【讨论】:

  • 仅仅因为我们“应该已经知道一些事情”而投反对票是一个非常糟糕的借口。像我和@Marco Falzone 这样的人来这里是为了这些建议,因为这对我们来说可能并不那么明显,因此请求建议。在我看来,以“你应该已经知道...”之类的负面观点指出它是对学习的一种威慑。除此之外!感谢您的回答,至少为自己提供了一个很好的起点来开始玩耍和学习新主题。
  • @RossLyons 我同意没有 cmets 的投票没有帮助,这就是我回答的原因。
【解决方案2】:

由于您要移动文件 - 最简单的方法是包装到 while 1 循环中

【讨论】:

    【解决方案3】:

    我真的无法理解对我的帖子的反对票。这是我经过一些调查和试验后的解决方案。它可能对其他人有用。

    #  The following script listens for new files in a folder and processes them
    #
    # BEGIN SCRIPT
    
    $folder = 'c:\temp'             # My path
    $filter = '*.*'                 # File types to be monitored
    
    $fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{    # Listening function
     IncludeSubdirectories = $false              # Put "True" to scan subfolders
     EnableRaisingEvents = $true
     NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
    }
    $onCreated = Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
     $path = $Event.SourceEventArgs.FullPath            
     $name = $Event.SourceEventArgs.Name                
     $changeType = $Event.SourceEventArgs.ChangeType    
     $timeStamp = $Event.TimeGenerated                  
     $destination = 'c:\temp\fixed\'                    
     $outfile = $destination + $name
     Write-Host "The file '$name' was $changeType and processed at $timeStamp"   -ForegroundColor Yellow # Log message on the screen
     (Get-Content $path -Raw) -replace "`n",'' | Set-Content -path $outfile  
     Remove-Item $path   # Delete original files
    }
    
    #  END SCRIPT
    

    【讨论】:

      猜你喜欢
      • 2012-12-02
      • 1970-01-01
      • 2017-01-16
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 2015-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多