windows - 将文件添加到文件夹时运行 .bat 文件的 Powershell 脚本

标签 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。

更新二

我尝试了下面丹尼斯的代码,但我什么也没得到。我只是仔细检查了我所有的路径,以确保它们与他所拥有的相同。我还刚刚制作了一个具有更简单路径的新测试版本,这样我就可以准确发布我所拥有的内容而无需匿名:

 $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/

相关文章:

windows - 搜索维护的二进制差异/补丁工具或库

windows - 使用 powershell 设置 Windows 屏幕保护程序需要密码

c# - Pcap .NET 库 : PcapDotNet. Core.DLL 未找到

powershell - Login-AzureRmAccount : The term 'Login-AzureRmAccount' is not recognized as the name of a cmdlet, 函数、脚本

由于unicode字符,Powershell脚本无法运行

powershell - 如何捕获变量而不是日志文件中的输出?

c++ - en_US.UTF-8 语言环境的 Windows 等效项是什么?

c# - 复制注册表中的子类别

windows - Powershell glob 模式匹配

powershell - 我可以使用系统帐户调用Invoke-RestMethod吗?