1

我使用 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 附加到在登录用户下运行的进程?

4

2 回答 2

0

好的,所以我已经回答了我自己的问题。我最终创建了另外几个脚本,一个用于创建安全密码并将其存储到 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 的处理还没有工作,但我越来越近了):

# 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
于 2013-10-10T22:09:40.727 回答
0

我想你可能在错误的地方寻找你的问题。

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

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

于 2013-10-08T19:34:41.257 回答