.net 从批处理文件调用时,Powershell在创建新对象时出现问题

.net 从批处理文件调用时,Powershell在创建新对象时出现问题,.net,powershell,batch-file,.net,Powershell,Batch File,我使用NextPVR录制一些电视节目,并使用powershell脚本将录制的TS文件转换为MP4,用MetaX标记该文件,然后将该文件添加到iTunes 录制完成后,NextPVR将自动调用名为PostProcessing.bat的批处理文件,并传递多个参数。在此批处理文件中,我有以下命令来调用我的Powershell脚本: ::Place this batch file in "C:\Users\Public\NPVR\Scripts" @ECHO OFF cd /d "%~dp0" SE

我使用NextPVR录制一些电视节目,并使用powershell脚本将录制的TS文件转换为MP4,用MetaX标记该文件,然后将该文件添加到iTunes

录制完成后,NextPVR将自动调用名为PostProcessing.bat的批处理文件,并传递多个参数。在此批处理文件中,我有以下命令来调用我的Powershell脚本:

::Place this batch file in "C:\Users\Public\NPVR\Scripts" 
@ECHO OFF
cd /d "%~dp0" 
SET parent=%~dp1
IF %parent:~-1%==\ SET parent=%parent:~0,-1%

:: Call PowerShell script to handle post processing.
powershell -ExecutionPolicy RemoteSigned -File "C:\Users\Steve\Dropbox\Applications\Scripts\NVPR.ps1" "%parent%" %1
EXIT
我认为这个脚本被称为本地系统,我认为这是我的主要问题。我有以下函数,当以我自己的身份运行时,它工作得很好,但通过批处理文件调用时失败:

function addToiTunes($path) {
    # get reference to the running iTunes
    $iTunes = New-Object -ComObject iTunes.application
    $LibrarySource = $iTunes.LibrarySource
    foreach ($pList in $LibrarySource.Playlists) {
        if ($pList.Name -eq "Library") {
            $playList = $pList
            Break
        }
    }
    try {
        $playList.AddFile($path)
    } catch {
        return $false
    }
    return $true
}

是否有一种方法可以将PS1作为当前登录用户调用,而无需使用凭据等,或者将ComObject附加到在登录用户下运行的进程?

我认为您可能在错误的位置搜索问题

批处理文件以及从中运行的后续powershell脚本将获得调用它们的用户的权限。如果在windows或更高版本上运行,您可能会受到windows安全性的影响,但您可以通过右键单击批处理并单击“以管理员身份运行”或打开admin cmd提示符并从那里运行批处理来避免这种情况


您可以将其作为其他进程打开的唯一其他方法是将批处理文件安排为任务,并将runas user设置为SYSTEM。但正如我所说,如果您以具有适当权限的用户身份登录,您应该不会有任何问题。

好的,所以我基本上回答了我自己的问题。最后,我创建了另外两个脚本,一个用于创建安全密码并将其存储到PC:

$password = Read-Host "Please enter a password to be encrypted:" -AsSecureString
$path = Read-Host "Please enter a path where pwd.txt is to be stored:"
If ($path[-1] -ne "\") {
    $path += "\"
}
$path += "pwd.txt"
ConvertFrom-SecureString $password | Out-File $path
第二个可以从文件中获取凭据,并启动一个传递给它的脚本(Params的处理还不起作用,但我越来越近了):


NextPVR是否使用服务/系统帐户而不是当前登录的用户凭据??NextPVR有一个名为nrecord.exe的服务,它在后台记录节目。此后,我将服务更改为以我的身份运行,但这似乎并没有解决问题。录制完成后,NextPVR将调用PostProcessing.bat。我想构建一个从头到尾自动化的流程。我以前是在一个重复的任务下做这件事的,但是让它每10分钟左右运行一次并不是最好的解决方案。但是,我确实希望录制完成后立即进行处理,因此很少有人会像我所希望的那样进行处理。我认为另一个选项是创建一个windows计划任务(未计划),并使用以下命令从批处理文件调用计划任务:schtasks/Run[/S[/U[/P[]]]]/TN,但是这不允许我传入参数。。。因此,这也可能不是一个好的解决方案。您可以在powershell中以相同的方式调用schtasks,从而简化参数传递
# Get parameter credentials
$username = $args[0]
$passwordPath = $args[1]
$scriptToRun = $args[2]
$param1 = $args[3]
$param2 = $args[4]
$param3 = $args[5]
$param4 = $args[6]
$param5 = $args[7]
$param6 = $args[8]

# Collect arguments into a single array.
$arguments = @()
if ($param1 -ne $null) {$arguments += $param1}
if ($param2 -ne $null) {$arguments += $param2}
if ($param3 -ne $null) {$arguments += $param3}
if ($param4 -ne $null) {$arguments += $param4}
if ($param5 -ne $null) {$arguments += $param5}
if ($param6 -ne $null) {$arguments += $param6}

# Set credentials and launch passed script.
$cred = New-Object System.Management.Automation.PSCredential -ArgumentList @($username,(ConvertTo-SecureString (Get-Content $passwordPath)))
Invoke-Command -FilePath $scriptToRun -Credential $cred -ComputerName localhost -ArgumentList $arguments