Powershell-如何在后台从批处理运行监控文件夹脚本?

Powershell-如何在后台从批处理运行监控文件夹脚本?,powershell,process,monitor,Powershell,Process,Monitor,我编写了一个PowerShell脚本,用于监视特定文件夹的更改,例如:创建/删除/重命名项目 然后将所有这些操作写入日志文件。它很好用。唯一的问题是,它只在控制台打开时工作 每当我尝试使用批处理文件运行它时,它似乎不起作用(写入日志文件)。我正在尝试将其作为后台进程运行 这是监控功能: function CreateMonitor($folder) { $folder = 'C:\Users\...\Monitored Folder\' # Enter the root path

我编写了一个PowerShell脚本,用于监视特定文件夹的更改,例如:创建/删除/重命名项目

然后将所有这些操作写入日志文件。它很好用。唯一的问题是,它只在控制台打开时工作

每当我尝试使用批处理文件运行它时,它似乎不起作用(写入日志文件)。我正在尝试将其作为后台进程运行

这是监控功能:

function CreateMonitor($folder)
{    
    $folder = 'C:\Users\...\Monitored Folder\' # Enter the root path you want to monitor. 
    $filter = '*.*'  # 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 
    Out-File -FilePath C:\Users\...\outlog.txt -Append -InputObject "The file '$name' was $changeType at $timeStamp"}                 
}
这是批处理文件内容:

powershell.exe -windowstyle hidden -file C:\Users\....ps1

如何使其在后台/作为进程运行?

根据注释,可能是
Write Host
语句破坏了您的脚本,因为它试图将输出写入控制台,并且当您在没有窗口的情况下运行脚本时,没有可写入的控制台

最佳做法是将其更改为
编写详细的
,然后将
[cmdletbinding()]
添加到函数中。然后,如果/当您想查看该语句时,可以使用
-Verbose
开关调用函数:

function CreateMonitor
{    
    [cmdletbinding()]
    Param(
        $folder = 'C:\Users\...\Monitored Folder\',
        $filter = '*.*'
    )

    $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-Verbose "The file '$name' was $changeType at $timeStamp" -fore green 
    Out-File -FilePath C:\Users\...\outlog.txt -Append -InputObject "The file '$name' was $changeType at $timeStamp"}                 
}
您需要使用
Param()
块才能使用
[cmdletbinding()]
,因此我已将您的
$folder
参数移到该块中。我也在这里设置了它的默认值,在原始函数中,您覆盖了它(如果它是通过参数设置的)。在我看来,将
$filter
作为一个参数也是有意义的

如果您现在想查看详细输出,只需通过以下方式调用函数:

CreateMonitor -Verbose
当然,在后台运行时,您不会使用此开关,因为在哪里都看不到输出


有关为什么通常不鼓励使用
写主机
的更多信息,请参阅PowerShell创建者的这篇博文:

作为猜测,我假设您的文件看起来像

function CreateMonitor { ... }
CreateMonitor
如果是这种情况,那么它就是失败的,因为一旦ps1文件执行,它就会去并退出,因为不需要进一步的命令

如果你加上

while ($true) {} # alternately add Start-Sleep -s 1

然后ps1文件将保持运行,并且在成功创建filewatcher时不会退出。

不要使用写入主机。我已删除写入主机部分。但行为似乎是一样的。没有变化。它仍然不会写入日志文件。