我有一个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秒检查一次目录。
一些好的建议?
答案 0 :(得分:1)
执行此操作的基本方法是:
while ($true) {
# Your script here
Start-Sleep -Seconds 5;
}
下一个方法稍微复杂一些。您可以将脚本保存为.ps1文件,然后使用Windows任务计划程序每5秒运行一次脚本。
这两种方法都是如此基本,以至于你应该已经知道它们是合理的,并且没有解释为什么你不使用它们可能是你被投票和获得的原因。关闭投票。
第三种选择是使用System.IO.FileWatcher
和Register-ObjectEvent
。这个选项相当先进。 StackOverflow和elsewhere上有一些示例。这样做的好处是资源密集程度更低,但缺点是因为您使用的是用于创作服务的方法,所以有点像使用指甲枪来驱动单个钉子。
答案 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