批处理文件 运行 中的 Powershell 作为服务问题
Powershell in a batch file running as a service issue
披露
我是一名 PHP/Linux 开发人员,必须习惯在 Windows 环境中工作,所以我很可能遗漏了问题中的一些基本内容。我已经对此进行了研究,但似乎无法确定解决方案。感谢您的帮助。
我有一个调用 powershell 脚本的批处理文件,当它被 window 的任务调度程序启动时它不能正常工作,但是当它被手动启动时工作正常。
下面是批处理文件启动的 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 我需要这些脚本 运行 同时。
很确定问题出在您的参数列表上,现在您传递的是一个字符串,其中包含所有内容,将其更改为一个数组,事情应该会正常进行。
所以转换
".\General\PollingProcess-alone.ps1 $WatchFolder $MainFrameFolder $SASFolder $name $lock_file"
至
".\General\PollingProcess-alone.ps1",$WatchFolder,$WatchFolder,etc..
试一试,让我们知道它是否适合您,还想说您的代码令人印象深刻,因为它对 PowerShell 来说相对较新,所以很荣幸。
披露 我是一名 PHP/Linux 开发人员,必须习惯在 Windows 环境中工作,所以我很可能遗漏了问题中的一些基本内容。我已经对此进行了研究,但似乎无法确定解决方案。感谢您的帮助。
我有一个调用 powershell 脚本的批处理文件,当它被 window 的任务调度程序启动时它不能正常工作,但是当它被手动启动时工作正常。
下面是批处理文件启动的 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 我需要这些脚本 运行 同时。
很确定问题出在您的参数列表上,现在您传递的是一个字符串,其中包含所有内容,将其更改为一个数组,事情应该会正常进行。
所以转换
".\General\PollingProcess-alone.ps1 $WatchFolder $MainFrameFolder $SASFolder $name $lock_file"
至
".\General\PollingProcess-alone.ps1",$WatchFolder,$WatchFolder,etc..
试一试,让我们知道它是否适合您,还想说您的代码令人印象深刻,因为它对 PowerShell 来说相对较新,所以很荣幸。