0

披露 我是一名PHP/Linux开发人员,不得不习惯在Windows环境中工作,所以我很好地思考了一些基本问题。我已经研究了这一点,似乎无法找到一个解决方案。感谢您的高级帮助。作为服务问题运行的批处理文件中的Powershell

我有一个批处理文件,调用powershell脚本,当它由窗口的任务调度程序启动时无法正常工作,但在手动启动时完美工作。

下面是PowerShell脚本的批处理文件启动...

$WatchFolder = '\\networkshare\foldername' 
$Filter = '*.csv' 
$fsw = New-Object IO.FileSystemWatcher $WatchFolder, $Filter -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters] 'LastWrite'} 

Register-ObjectEvent $fsw Changed -SourceIdentifier SAS_Poll_FileChanged -Action {  
    $WatchFolder = '\\networkshare\foldername' 
    $OutputFolder_one = '\\networkshare\outputFolder_One' 
    $OutputFolder_two = '\\networkshare\outputFolder_Two' 

    $name = $Event.SourceEventArgs.Name 

    $lock_file = $WatchFolder + '\.' + $name + '.lock' 

    $test = (Test-Path "$lock_file") 

    if ($test){ 
     return 
    } else { 
     Set-ExecutionPolicy -Scope CurrentUser Bypass 
     Out-File -FilePath "$lock_file" 
     Start-Process powershell -ArgumentList ".\General\PollingProcess-alone.ps1 $WatchFolder $MainFrameFolder $SASFolder $name $lock_file" -NoNewWindow 
    } 

} 

我知道下面的行出现问题...

Start-Process powershell -ArgumentList ".\General\PollingProcess-alone.ps1 $WatchFolder $MainFrameFolder $SASFolder $name $lock_file" -NoNewWindow 

我知道这个B/C当事件被触发时(通过任务调度程序启动脚本时),会创建锁定文件,然后进程挂起。

因此,我认为这个问题与我打电话给第二个powershell脚本的路径有关,但我不知道如何解决它。我试过使用第二个脚本的完整路径,但一直未能使其工作。

只是为了给你一些更多的脚本上下文,事件进程加速新的powershell脚本b/c是非常重要的,我需要这些脚本并发运行。

回答

1

很确定问题出在你的参数列表上,现在你传递了一个包含其中所有内容的单个字符串,将其更改为一个数组,并且事情应该可以正常工作。

所以转换 ".\General\PollingProcess-alone.ps1 $WatchFolder $MainFrameFolder $SASFolder $name $lock_file"

".\General\PollingProcess-alone.ps1",$WatchFolder,$WatchFolder,etc..

给一个镜头,让,我们知道,如果你的作品也想说,你的代码是令人印象深刻的是相对较新的PowerShell所以荣誉大声笑。

+0

更改参数传递给数组是我做错了所有这一切的两件事之一。 我遇到的另一个问题是我如何设置计划任务。在计划任务的操作中,我删除了正在调用的脚本的路径,并将路径移至“开始”选项。这两个变化的结合似乎解决了我的问题。 再次感谢您的帮助。我希望自己能够承认这些代码的大部分内容,但这真的是对Powershell的敬意,以及该语言的文档记录。 –