Powershell脚本侦听文件

时间:2017-11-18 18:02:26

标签: powershell powershell-v2.0 powershell-v3.0

我有一个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文件夹中检测到新的传入文件时,脚本应自动处理它们。也许可以使用一些" sleep"命令,每隔5秒检查一次目录。

一些好的建议?

3 个答案:

答案 0 :(得分:1)

执行此操作的基本方法是:

while ($true) {

    # Your script here

    Start-Sleep -Seconds 5;
}

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

这两种方法都是如此基本,以至于你应该已经知道它们是合理的,并且没有解释为什么你不使用它们可能是你被投票和获得的原因。关闭投票。

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

答案 1 :(得分:0)

由于您正在移动文件 - 最简单的方法是将while 1循环包裹起来

答案 2 :(得分:0)

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

#  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