我想监控一个 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。
更新二
我尝试了下面丹尼斯的代码,但我什么也没得到。我只是仔细检查了我所有的路径,以确保它们与他所拥有的相同。我还刚刚制作了一个具有更简单路径的新测试版本,这样我就可以准确发布我所拥有的内容而无需匿名:
$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 的文件中,当我单击该文件时,控制台会闪烁一些红色文本,同样太快而无法阅读,然后它会关闭。
我做错了什么?我确定的东西。
更新三
按照丹尼斯的建议,我开始工作了。这需要稍微修改批处理文件以包含我要运行的 ANT 构建的完整路径,但它有效。
注意:我想我刚刚明白为什么触发器会重复,会更新。
最佳答案
给你:
$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'
}
关于windows - 将文件添加到文件夹时运行 .bat 文件的 Powershell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32405260/