Как добавить файловую зависимость в VisualStudioRemoteDeployer в удаленном сеансе PowerShell, запущенном из задачи развертывания TFS

Я использую задачу развертывания TFS «PowerShell на удаленных компьютерах». Он запускает сценарий PowerShell, который я ранее скопировал на целевую машину. Сценарий PowerShell вызывает командлет, который зависит от .exe. Я получаю следующую ошибку при выполнении скрипта:

System.IO.FileNotFoundException: C:\Windows\DtlDownloads\VisualStudioRemoteDeployer3be2a227-e8d4-4e1f-b155-d1a53666793b\NeuronExplorer.exe

Я не могу понять, как на самом деле получить NeuronExplorer.exe в этот временный каталог, чтобы он был доступен для выполнения.

Я пробовал использовать GAC. Это GAC успешно, но я получаю ту же ошибку.

Я попытался добавить путь к переменной среды PATH, что также привело к той же ошибке.

Я добился успеха, если скопировал NeuronExplorer.exe в временную папку, но мне нужно быть очень быстрым, чтобы заставить его работать. ДОЛЖЕН быть способ сделать этот файл доступным в удаленном контексте.


person Aaron Palmer    schedule 21.09.2017    source источник
comment
Не могли бы вы добавить связанный с вами скрипт powershell, который показывает, как вы вызывали .exe? Вы используете относительный путь или жестко кодируете его?   -  person PatrickLu-MSFT    schedule 22.09.2017
comment
Командлет, который я вызываю, использует стороннюю библиотеку DLL, которая зависит от нее .exe.   -  person Aaron Palmer    schedule 25.09.2017


Ответы (2)


Самым простым обходным решением здесь было бы вызвать исполняемый файл по полному явному пути.

Кроме того, вы не указали, изменили ли вы переменную среды PATH на уровне компьютера, но если вы это сделали, вам, скорее всего, потребуется перезапустить агент на этом компьютере, чтобы изменения отразились в процессе агента.

person Daniel Mann    schedule 22.09.2017

В итоге я решил эту проблему, скопировав .exe в мой System.AppDomain.CurrentDomain.BaseDirectory перед вызовом любого кода API, который зависит от .exe.

let fileName = (FileInfo pathToExe).Name
let targetFile = sprintf "%s\\%s" System.AppDomain.CurrentDomain.BaseDirectory fileName
File.Copy(pathToExe, targetFile, true)

Я мог бы сделать то же самое, используя System.AppDomain.CurrentDirectory.Load(assemblyBytes), но File.Copy у меня работает.

Надеюсь, это поможет кому-то еще не бороться с этой конкретной проблемой.

person Aaron Palmer    schedule 25.09.2017