Как запустить exe-файл при выпуске в vsts

Я создал консольное приложение для получения заголовка сайта SharePoint в онлайн-студии Visual Studio. URL-адрес сайта SharePoint передается в коде, но пароль необходимо вводить в окне консоли во время выполнения.

Затем я определил определение сборки и могу построить решение и скопировать файлы в артефакт.

И я настроил определение выпуска, и я пытаюсь запустить файл build-ed .exe, но получаю следующую ошибку:

Unhandled Exception: System.InvalidOperationException: Cannot read keys when either application does not have a console or when console input has been redirected from a file.

PS: Я определил переменную $ пройти, а затем добавил ее в раздел аргументов для получения пароля сайта SharePoint.

enter image description here

объявление переменной: enter image description here

Экран ошибки, который я получаю: enter image description here

Код для консольного приложения:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Security;
using System.Text;
using System.Threading.Tasks;
using Microsoft.SharePoint.Client; 

namespace VSTS_Demo_App
{
    class Program
    {
        static void Main(string[] args)
        {
            string userName = "$$$@$$$.onmicrosoft.com";  
            Console.WriteLine("Enter your password.");  
            SecureString password = GetPassword();  
            // ClienContext - Get the context for the SharePoint Online Site  
            // SharePoint site URL - https://c986.sharepoint.com  
            using (var clientContext = new ClientContext("https://$$$$$$$$$$$$$$$$$$$$$$$$$$"))   
            {  
                // SharePoint Online Credentials  
                clientContext.Credentials = new SharePointOnlineCredentials(userName, password);  
                // Get the SharePoint web  
                Web web = clientContext.Web;  
                // Load the Web properties  
                clientContext.Load(web);  
                // Execute the query to the server.  
                clientContext.ExecuteQuery();  
                // Web properties - Display the Title and URL for the web  
                Console.WriteLine("Title: " + web.Title + "; URL: " + web.Url);  
                Console.ReadLine();  
            }  
        }  
        private static SecureString GetPassword()  
      {  
            ConsoleKeyInfo info;
            Console.WriteLine("get passwod -called");
            //Get the user's password as a SecureString  
            SecureString securePassword = new SecureString();  
            do   
            {  
                info = Console.ReadKey(true);  
                if (info.Key != ConsoleKey.Enter)   
                {  
                    securePassword.AppendChar(info.KeyChar);  
                }  
            }  
            while (info.Key != ConsoleKey.Enter);  
            return securePassword;  
        }  
    }  
}

Вы решаете эту проблему?

starian chen-MSFT 07.05.2018 07:48
0
1
815
2

Ответы 2

Проблема в ваших методах Console.ReadLine (). При запуске сборки vsts перенаправляет ввод и вывод консоли.

Ваш код ломается здесь info = Console.ReadKey(true);, на основе предоставленной вами трассировки стека.

Вы передаете его через аргументы, но не используете. Измените свой код на:

SecureString password;

if (args.length > 0)
{
  password = args;
}
else
{
  password = GetPassword(); 
}

Я не проверял, будет ли пароль = args работать напрямую или вам нужно добавлять символы. Это я оставлю тебе.

Обновите свой код следующим образом:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Security;
using System.Text;
using System.Threading.Tasks;
using Microsoft.SharePoint.Client; 

namespace VSTS_Demo_App
{
    class Program
    {
        static void Main(string[] args)
        {
            string userName = "$$$@$$$.onmicrosoft.com";  
            Console.WriteLine("Enter your password.");  

            SecureString password = GetPassword(args);  
            // ClienContext - Get the context for the SharePoint Online Site  
            // SharePoint site URL - https://c986.sharepoint.com  
            using (var clientContext = new ClientContext("https://$$$$$$$$$$$$$$$$$$$$$$$$$$"))   
            {  
                // SharePoint Online Credentials  
                clientContext.Credentials = new SharePointOnlineCredentials(userName, password);  
                // Get the SharePoint web  
                Web web = clientContext.Web;  
                // Load the Web properties  
                clientContext.Load(web);  
                // Execute the query to the server.  
                clientContext.ExecuteQuery();  
                // Web properties - Display the Title and URL for the web  
                Console.WriteLine("Title: " + web.Title + "; URL: " + web.Url);  
                //Console.ReadLine();  
            }  
        }  
        private static SecureString GetPassword(string[] args)  
      {  
            ConsoleKeyInfo info;
            Console.WriteLine("get passwod -called");
            //Get the user's password as a SecureString  
            SecureString securePassword = new SecureString();  
            if (args.length > 0)
            {
               char[] cs= args[0].ToCharArray();
               foreach(char c in cs)
               {
                securePassword.AppendChar(c);  
               } 
            }
           else
            {
            do   
            {  
                info = Console.ReadKey(true);  
                if (info.Key != ConsoleKey.Enter)   
                {  
                    securePassword.AppendChar(info.KeyChar);  
                }  
            }  
            while (info.Key != ConsoleKey.Enter);  
            }
            return securePassword;  
        }  
    }  
}

Другие вопросы по теме