我想监视Windows 7文件夹,并在将任何新文件添加到该文件夹时运行.bat文件。看起来我应该能够使用安装在计算机上的powershell来做到这一点。
我已经阅读了一些像this one这样的答案,但是通过修改我看到的内容,我无法获得任何工作。详细说明:
要监控的文件夹:
c:\aaa\bbb\monitorThis
将.htm文件添加到受监控文件夹时要运行的批处理文件:
c:\aaa\bbb\runA.bat
Powershell脚本文件:
c:\aaa\bbb\folderWatcher.ps1
有人可以描述folderWatcher.ps1的内容应该是什么样的,包括包含运行.bat文件的命令,注册和取消注册事件等的行吗?
此外,右键单击.ps1文件并选择“使用PowerShell运行”开始监控的方式,如果是,您如何阻止它?
更新
根据要求,这是我目前为folderWatcher.ps1所做的,但它只是一个开始,来自我见过的想法:
$folder = "c:\aaa\bbb\toConvert"
$filter = "*.*"
$fsw = new-object System.IO.FileSystemWatcher $folder, $filter -Property @{
IncludeSubDirectories=$false
NotifyFilter = [System.IO.NotifyFilters]'FileName, LastWrite'
}
$onCreated = Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
Start-Process cmd -ArgumentList "/c runA.bat" -WorkingDirectory "C:\aaa\bbb"
}
注意:重新过滤,我不关心添加什么类型的文件,因为我们只会将.htm文件放在该文件夹中,所以添加到它的任何内容我都要触发.bat。
更新II
我在下面尝试了丹尼斯的代码,但我一无所获。我只是仔细检查了所有的路径,以确保它们与他的相同。我还制作了一个新的测试版本,路径更简单,所以我可以准确地发布我的内容,而不必匿名化:
$folder = 'C:\Developer\psTest' # Enter the root path you want to monitor.
$filter = '*.htm' # You can enter a wildcard filter here.
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}
Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
$name = $Event.SourceEventArgs.Name
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated
Write-Host "The file '$name' was $changeType at $timeStamp" -fore green
cmd.exe /c 'C:\Developer\psTest\runAnt.bat'
}
要清楚我在做什么:
我有一个名为C:\Developer\psTest\FolderWatcherTest.ps1
的文件,其中包含上面的代码。
当我右键单击它并选择使用PowerShell运行时,控制台窗口会闪烁一些文本,但在关闭之前它太快无法读取。
当我将.htm文件拖到C:\Developer\psTest
时,没有任何反应。
我将取消注册代码放入一个名为FolderWatcherStop.ps1的文件中,当我点击它时,控制台会闪烁一些红色文字,再次快速阅读,然后关闭。
我做错了什么?我确定的东西。
更新III
根据丹尼斯的建议,我得到了这个工作。这需要稍微修改批处理文件以包含我想要运行的ANT构建的完整路径,但它可以工作。
注意:我想我知道触发器重复的原因,将会更新。
答案 0 :(得分:1)
你走了:
$folder = 'f:\test' # Enter the root path you want to monitor.
$filter = '*.html' # You can enter a wildcard filter here.
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}
Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
$name = $Event.SourceEventArgs.Name
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated
Write-Host "The file '$name' was $changeType at $timeStamp" -fore green
write-host "test"
Invoke-Item 'f:\test\test.bat'
}
答案 1 :(得分:0)
您还可以使用此代码在后台运行ps1文件,而不是invoke-item
Invoke-Expression-命令“ C:.... \ somescript.ps1”