TLDR 版本
我需要运行一个 32 位 PowerShell 脚本,该脚本需要三个参数作为计划任务Windows 服务器 2008R2. 该脚本启动了一个 FileSystemWatcher,所以我需要让它保持活动状态,以便它可以继续获取新文件。
如果您正在浏览的话,您可能应该看看下面“参数”下的内容。
背景
我创建了一个 PowerShell 脚本,该脚本可从我的 Windows Server 2008 R2 机器上的 x86 PowerShell 控制台正常运行。它创建了一个 FileSystemWatcher,并为文件创建事件注册了一个操作。因为我需要 FileSystemWatcher 继续监视,所以我需要 PowerShell 继续运行,而不是在脚本触发后立即退出:
该脚本接受三个参数:
- 要观看的文件夹的路径
- 它将移动任何新的 .xlsx 文件的文件夹路径,并根据 .xlsx 文件的内容写入输出文本文件。
- 日志文件的路径。
但是我无法让脚本作为计划任务正确运行。我认为问题在于我使用的参数,但我不知道什么参数是正确的。
设置
由于我需要该脚本在32位PowerShell中运行,所以我将计划任务的程序设置为%SystemRoot%\syswow64\WindowsPowerShell\v1.0\powershell.exe。
我已经确保设置了执行策略到 32 位 PowerShell 中本地计算机的 RemoteSigned。
参数
我尝试了几种不同的参数变体。以下在控制台中运行,但在某种程度上失败了任务计划程序:
任务运行,但未写入日志文件,这表明它可能甚至尚未启动 FileSystemWatcher。无论如何,它不会在创建文件时拾取它们:
powershell -Noexit -File "D:\Scripts\myScript.ps1" "\\otherServer\share\folder\subfolder\" "\\someserver.domain.edu\D$\working_directory\" "\\otherServer\share\folder\my_log.txt"
任务退出时代码为 0xFFFD0000(见Powershell 计划任务的最后结果为 0xFFFD0000)。我确信该任务正在作为适当的服务帐户运行,该帐户有权访问参数中使用的网络共享。
powershell -Noexit -File 'D:\Scripts\myScript.ps1' '\\otherServer\share\folder\subfolder\' '\\someserver.domain.edu\D$\working_directory\' '\\otherServer\share\folder\my_log.txt'
这些变体甚至在控制台中不起作用(甚至没有第一次写入日志):
powershell -Noexit -File "D:\Scripts\myScript.ps1" "\\otherServer\share\folder\subfolder\ \\server.domain.edu\D$\working_directory\ \\otherServer\share\folder\my_log.txt"
powershell -Noexit -command {"& 'D:\Scripts\myScript.ps1' '\\otherServer\share\folder\subfolder\' '\\server.domain.edu\D$\working_directory\' '\\otherServer\share\folder\my_log.txt'"}
基于脚本专家博客,我想我应该尝试使用-Command
参数而不是-File
。这两个变体在控制台中启动文件系统观察器并将相应的消息写入日志文件,但它们不会在创建时拾取文件:
powershell -Noexit -command "& 'D:\Scripts\myScript.ps1' '\\otherServer\share\folder\subfolder\' '\\server.domain.edu\D$\working_directory\' '\\otherServer\share\folder\my_log.txt'"
powershell -Noexit -command "& D:\Scripts\myScript.ps1 \\otherServer\share\folder\subfolder\ \\server.domain.edu\D$\working_directory\ \\otherServer\share\folder\my_log.txt"
代码
因为脚本在控制台中运行,所以我很确定问题不在于代码本身。不过,对于那些不看代码就不会满意的人来说,这里有一些来自脚本本身的相关部分。:)
创建 FileSystemWatcher
Function startWatcher ($onFolder) {
try {
#Create a file watcher
$filter = "*.xlsx"
$fsWatcher = New-Object IO.FileSystemWatcher $onFolder, $filter -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}
$fileWatcherStartDate = (Get-Date -format M.d.yyyy.HH.mm.ss).Tostring()
log($fileWatcherStartDate)
log "Started file system watcher on $onFolder for $filter files.`r`n"
return $fsWatcher
}
catch {
handleError("Error starting file system watcher")
}
}
注册创建事件
Function registerCreationEvent ($watcher) {
log "Attempting to register creation event..."
try {
Register-ObjectEvent $watcher Created -SourceIdentifier FileCreated -Action {
try {
#Code to read from Excel file, create an output text file from the
#content, and move both to the specified working directory.
}
catch {
handleError("Performing main action on individual file.")
}
}
log "Event creation registered."
}
catch {
handleError("Error registering creation event")
}
}
答案1
天哪,我想我已经明白了!
最终,我恢复到了最初在控制台中运行的方式(即点源),但在前面添加了 -Noexit 标志:
程序:
%SystemRoot%\syswow64\WindowsPowerShell\v1.0\powershell.exe
参数:
-Noexit . D:\Scripts\myScript.ps1 \\otherserver\share\folder\subfolder\ \\server.domain.edu\D$\working_dir\ \\otherserver\share\folder\my_log.txt