有没有简单的方法(即脚本)来观看文件在Powershell和运行命令,如果文件发生变化。我一直在谷歌搜索,但不能找到简单的解决方案。基本上我运行脚本在Powershell和如果文件发生变化,然后Powershell运行其他命令。
编辑
好吧,我想我犯了一个错误。我不需要脚本,一个需要的函数,我可以包括在我的$PROFILE.ps1
文件。但仍然,我很努力,仍然我不能写它,所以我会给予赏金。它必须看起来像这样:
function watch($command, $file) {
if($file #changed) {
#run $command
}
}
有一个NPM模块正在做我想做的事情,watch
,但它只监视文件夹而不是文件,而且它不是Powershell xD。
9条答案
按热度按时间fkvaft9z1#
这里是我在我的片段中找到的一个例子。希望它更全面一点。
首先,您需要创建一个文件系统监视器,然后订阅该监视器生成的事件。此示例侦听"Create"事件,但可以轻松地修改为监视"Change"事件。
我会尽量缩小范围,满足你的要求.
如果您将此作为"profile.ps1"脚本的一部分运行,您应该阅读The Power of Profiles,其中解释了可用的不同配置文件脚本等。
此外,您应该了解,等待文件夹中的更改不能作为脚本中的函数运行。配置文件脚本必须完成,才能启动PowerShell会话。但是,您可以使用函数注册事件。
它的作用是注册一段代码,在每次触发事件时执行。当会话保持打开时,此代码将在当前PowerShell主机(或shell)的上下文中执行。它可以与主机会话交互,但不知道注册代码的原始脚本。在触发代码时,原始脚本可能已经完成。
下面是代码:
运行完这段代码后,更改"C:\temp"目录(或您指定的任何其他目录)中的任何文件,您将看到一个触发代码执行的事件。
此外,您可以注册的有效FileSystemWatcher事件包括"已更改"、"已创建"、"已删除"和"已重命名"。
yqkkidmi2#
我将添加另一个答案,因为我的前一个确实错过了要求。
要求
已经有一个使用文件散列的答案了。我想按照我之前的答案,向您展示如何使用FileSystemWatcher来完成这一点。
zengzsys3#
以下是我根据前面几个答案得出的解决方案。我特别希望:
1.我的代码是代码,而不是字符串
1.我的代码将在I/O线程上运行,这样我就可以看到控制台输出
1.每次发生更改时都会调用我的代码,而不是一次
边注:我已经留下了我想要运行的细节,因为使用全局变量在线程之间通信是一个讽刺,这样我就可以编译Erlang代码。
如果你想要更通用的东西,你可以把folder/filter/action传递到watch中。希望这对其他人来说是一个有帮助的起点。
zbq4xfa04#
1.计算文件列表的哈希
1.将其存储在字典中
1.按时间间隔检查每个哈希
1.哈希不同时执行操作
示例用法:
xesrikrc5#
您可以使用
System.IO.FileSystemWatcher
监视文件。另请参见this article
uklbhaso6#
这是另一个选择。
我只需要编写自己的代码来在Docker容器中监视和运行测试。Jan的解决方案要优雅得多,但FileSystemWatcher目前在Docker容器中是坏的。我的方法与Vasili的类似,但更懒,相信文件系统的写入时间。
下面是我需要的函数,它在每次文件更改时运行命令块。
下面是一个等待文件更改,运行块,然后退出的方法。
q0qdq0h27#
我也遇到过类似的问题,我最初想使用Windows事件和注册,但这会比下面的解决方案容错性差。
我的解决方案是一个轮询脚本(间隔3秒)。该脚本占用系统的空间最小,并且可以非常快地注意到变化。在循环过程中,我的脚本可以做更多的事情(实际上我检查了3个不同的文件夹)。
我的轮询脚本是通过任务管理器启动的。计划每5分钟启动一次,并带有stop-when-already-running标志。这样,它将在重新启动或崩溃后重新启动。
使用任务管理器每3秒轮询一次对任务管理器来说太频繁了。当您将任务添加到调度程序时,请确保您没有使用网络驱动器(这将需要额外的设置),并给予您的用户批处理权限。
我在午夜前几分钟关闭脚本,让它有一个干净的开始,任务管理器每天早上启动脚本(脚本的init函数在午夜前后1分钟退出)。
ha5z0ras8#
我在寻找一种可以从航站楼搭乘一班飞机的东西。这是我找到的东西:
7vhp5slm9#
另一个简单的版本: