将文件添加到文件夹

时间:2015-09-04 19:28:12

标签: windows powershell

我想监视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构建的完整路径,但它可以工作。

注意:我想我知道触发器重复的原因,将会更新。

2 个答案:

答案 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”