none
Адаптация кода Powershell 4.0 для Powershell 2.0 RRS feed

  • Вопрос

  • Писал код на системе с powershell версии 4, на ней всё работает успешно. Но необходимо перенести скрипт на систему с Windows XP, где соответственно powershell доступен в максимальной версии 2.

    Большинство ошибок (несоответствий), было связано с обращением к свойству массива объектов, например:

    Есть массив объектов $feed.Entries, при вызове на ps4 $feed.Entries.Title.Text выводился список имён записей, но в ps2 такое не срабатывало, и пришлось заменить на $feed.Entries | %{$_.Title.Text}

    Основную часть кода удалось исправить, но одна функция  ни как не хочет работать (перемещающая файл на Google Drive в определённую папку-коллекцию), в чём может быть ошибка?

    Код функции, готовой для запуска (на ps4 работает успешно, на ps2 не работает):

    $script:username="xxx@gmail.com" #Логин Google
    $script:password="xxx" #Пароль от логина Google
    
    #Подгружаем библиотеки GDATA API SDK (https://code.google.com/p/google-gdata/downloads/detail?name=Google_Data_API_Setup_2.2.0.0.msi)
    #Для Windows x32, вместо "Program Files (x86)" будет соответсвенно "Program Files"
    Add-Type -Path "C:\Program Files (x86)\Google\Google Data API SDK\Redist\Google.GData.Documents.dll" 
    Add-Type -Path "C:\Program Files (x86)\Google\Google Data API SDK\Redist\Google.GData.Client.dll"
    
    function MoveToFolder ($file)
    {
        $service = New-Object Google.GData.Documents.DocumentsService("Test")
        $service.setUserCredentials($username, $password) #привязываем учётные данные к запросу
        $fquery = New-Object Google.GData.Documents.FolderQuery
        $ffeed = $service.Query($fquery) #отправляем запрос на все папки на Google Drive
        $folder=$ffeed.Entries | ?{$_.Title.Text -eq "FolderX"} #выбираем из ответного потока папку с именем FolderX
        $content=New-Object Google.GData.Documents.FolderQuery($folder.ResourceId) #Здесь и далее в подобных местах предположим, что на Google Drive только одна папка FolderX с таким именем и только один файл с именем file123456.txt
    
        $dquery = New-Object Google.GData.Documents.DocumentsListQuery
        $dfeed = $service.Query($dquery) #отправляем запрос на все файлы на Google Drive
        $fname=[System.IO.Path]::GetFileName($file) #выделяем имя файла из полного пути
        $efile=$dfeed.Entries | ?{$_.Title.Text -eq "$fname"} #выбираем из ответного потока файл с именем file123456.txt
        $entry=New-Object Google.GData.Documents.DocumentEntry #объявляем пустую запись
        $entry.Id=$efile.Id #присваиваем записи id от выбранного файла file123456.txt, расположенного на Google Drive
        $fmovment=$service.Insert($content.Uri,$entry) #перемещаем файл (в этом месте возникает ошибка в ps2)
        If (($fmovment.ParentFolders | %{$_.Title}) -eq "FolderX") #определяем было ли успешно произведено перемещение файла, анализируя ответ сервера
            {$rootContent=New-Object Google.GData.Documents.FolderQuery("folder:root") #далее удаляем файл из корня Google Drive - в противном случае, он будет одновременно представлен в двух папках
             $rfeed=$service.Query($rootContent)
             $dfile=$rfeed.Entries | ?{$_.Title.Text -eq "$fname"}
             If ($dfile) 
                {$dfile[0].Delete()}}
        Else {$script:moveOk=0}  
    }
    
    MoveToFolder "D:\file123456.txt"

    Пример из оф документации на .Net: https://developers.google.com/google-apps/documents-list/#adding_a_resource_to_a_collection
    • Изменено MoxFulder 3 декабря 2013 г. 13:26 Дополнение ссылкой
    3 декабря 2013 г. 12:07

Ответы

  • Решение очень костыльное, но работает. Надеюсь программисты подскажут более легкое решение.

    1) Сохранить код в файле GDataHelp.cs

    using System;
    using Google.GData.Client;
    using Google.GData.Documents;
     
    namespace GData
    {
        public class Help
        {
            public static DocumentEntry Insert(DocumentsService service, FolderQuery content, DocumentEntry entry)
            {
                return service.Insert(content.Uri, entry);
            }
        } 
    }
    

    2) Соберем библиотеку

    #Где расположен файл GDataHelp.cs
    cd D:\1
    C:\Windows\Microsoft.NET\Framework\v2.0.50727\csc.exe /r:"C:\Program Files (x86)\Google\Google Data API SDK\Redist\Google.GData.Documents.dll"`,"C:\Program Files (x86)\Google\Google Data API SDK\Redist\Google.GData.Client.dll" /out:GDataHelp.dll /target:library GdataHelp.cs

    3) Скопируем библиотеку GdataHelp.dll в "C:\Program Files (x86)\Google\Google Data API SDK\Redist\"

    4) Добавим строчку в скрипт

    [Reflection.Assembly]::LoadFrom("C:\Program Files (x86)\Google\Google Data API SDK\Redist\GdataHelp.dll")

    5) Для использования метода

    $fmovment = [Gdata.Help]::Insert($service,$content,$entry)

    • Помечено в качестве ответа KazunEditor 18 декабря 2013 г. 8:27
    3 декабря 2013 г. 20:24
    Отвечающий