Найти тему
Вадим Сухотин

О том, как искусственный интеллект попытался меня обмануть, когда я консультировался с ChatGPT по IT-тематике.

Я регулярно ищу всякую профессиональную информацию в интернете, и недавно я решил попробовать сделать это через бот ChatGPT. Приведу результаты этих проб. Взял для них две ситуации из своей реальной практики, по которым я на самом деле уже знал ответ заранее, поэтому мне было проще оценить ответы бота, и одну, по которой ответ не знал. Оговорю, что работал с бесплатной версией бота - Sage. Возможно, что платный (GPT-4) оказался бы “умнее”.

Ситуация 1.

Хочу скриптом Powershell читать и записывать ключи в ini-файле. Поиск соответствующих командлетов результатов не дал. Поиск в интернете выдал наиболее адекватный вариант: самостоятельно «парсить» ini-файл, читая его, как обычный текстовый файл, и самостоятельно формировать строки для записи в него. Это я в итоге и сделал, хотя и немного другим способом, чем предлагалось на найденном сайте.

Далее идёт диалог с ChatGPT (жирным шрифтом выделил мои реплики, наклонным – его ответы): 

=================

Как в Powershell читать и писать значения ключей ini-файла

+++++++++++

Для работы с ini-файлами в PowerShell можно использовать встроенные функции .NET Framework.

Для чтения значения ключа ini-файла можно использовать класс `System.IO.IniFile` из пространства имен `System.IO`. Пример чтения значения ключа:

```powershell

$filePath = "C:\path\to\file.ini"

$sectionName = "SectionName"

$keyName = "KeyName"

$iniFile = New-Object System.IO.IniFile($filePath)

$value = $iniFile.GetValue($sectionName, $keyName)

```

Для записи значения ключа ini-файла можно использовать ту же функцию `SetValue` класса `System.IO.IniFile`. Пример записи значения ключа:

```powershell

$filePath = "C:\path\to\file.ini"

$sectionName = "SectionName"

$keyName = "KeyName"

$value = "NewValue"

$iniFile = New-Object System.IO.IniFile($filePath)

$iniFile.SetValue($sectionName, $keyName, $value)

```

Обратите внимание, что для использования класса `System.IO.IniFile` в PowerShell необходимо импортировать пространство имен `System.IO` с помощью команды `Add-Type -AssemblyName System.IO`.

=================

Как удалить ключ из ini-файла в PowerShell?

+++++++++++

Для удаления ключа из ini-файла в PowerShell можно использовать метод `DeleteKey` класса `System.IO.IniFile`. Пример удаления ключа:

```powershell

$filePath = "C:\path\to\file.ini"

$sectionName = "SectionName"

$keyName = "KeyName"

$iniFile = New-Object System.IO.IniFile($filePath)

$iniFile.DeleteKey($sectionName, $keyName)

```

Обратите внимание, что метод `DeleteKey` не бросает исключение, если удаляемый ключ не существует в ini-файле. Если ключ не найден, то метод просто ничего не делает.

=================

Похоже, что ты меня обманул: в System.IO нет класса IniFile (это я пишу ему после того, как проверил его рекомендацию).

++++++++++

Вы правы, извините за мою ошибку. Класс `IniFile` не является стандартным классом в .NET Framework. Однако, вы можете использовать другие классы, чтобы работать с INI-файлами.

Например, вы можете использовать класс `System.Configuration.ConfigurationManager` для чтения значений из INI-файлов. Для этого вам нужно создать файл конфигурации (файл .config) и добавить в него секцию `appSettings`, где вы можете указать ключи и значения.

Вот пример файла конфигурации:

```

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <appSettings>

    <add key="Setting1" value="Value1" />

    <add key="Setting2" value="Value2" />

  </appSettings>

</configuration>

```

Вы можете получить значения настроек, используя следующий код:

```csharp

string setting1 = ConfigurationManager.AppSettings["Setting1"];

string setting2 = ConfigurationManager.AppSettings["Setting2"];

```

Вы также можете использовать сторонние библиотеки, которые предоставляют классы для работы с INI-файлами, например, библиотеку `IniParser`.

=================

Файл конфигурации данного формата не похож на ini-файл, это формат XML.

++++++++++++++

Вы абсолютно правы, извините за мою невнимательность. INI-файлы имеют свой формат, который отличается от формата файлов конфигурации в .NET Framework.

INI-файлы представляют собой текстовые файлы, содержащие секции, ключи и значения, они имеют расширение .ini. Вот пример INI-файла:

```

[Section1]

Key1=Value1

Key2=Value2

[Section2]

Key3=Value3

Key4=Value4

```

Для работы с INI-файлами в C# вы можете использовать, например, класс `System.IO.StreamReader` для чтения данных из файла и `System.IO.StreamWriter` для записи данных в файл. Вот пример чтения значения из INI-файла:

```csharp

string path = @"C:\path\to\file.ini";

string sectionName = "Section1";

string keyName = "Key1";

string value = "";

using (StreamReader sr = new StreamReader(path))

{

    string line;

    bool sectionFound = false;

    while ((line = sr.ReadLine()) != null)

    {

        // Поиск секции

        if (line.TrimStart().StartsWith("[" + sectionName + "]"))

        {

            sectionFound = true;

        }

        // Поиск ключа и значения

        else if (sectionFound && line.Contains("="))

        {

            string[] parts = line.Split('=');

            if (parts.Length >= 2 && parts[0].Trim() == keyName)

            {

                value = parts[1].Trim();

                break;

            }

        }

    }

}

```

Это пример только для чтения значения из INI-файла. Если вы хотите записать данные в INI-файл, вы можете использовать класс `System.IO.StreamWriter`. Однако, при записи в INI-файл важно учитывать формат файла и не затирать данные в уже существующих секциях и ключах.

=================

Итог: с первого раза бот дал мне совершенно неверную информацию. После указания на его ошибку он дал информацию, возможно, более корректную, но нерелевантную моему запросу (xml вместо ini). И только после повторного указания на ошибку он наконец показал тот рабочий вариант, который я и раньше находил через поисковик: самостоятельный парсинг. При всём при этом любопытно, что он вообще не рассматривал возможности работы с текстовыми файлами посредством встроенных средств Powershell (таких, как Get-Content,  который использовал я, или Switch, задействованный в решении, найденном мною на форуме), а сразу сосредоточился на средствах .Net Framework.

Ситуация 2.

Хочу в коллекции VBA проверять наличие нужного ключа. Предыдущий опыт мне уже показал, что специального метода для этого в этих коллекциях нет, поэтому для такой проверки надо либо перебирать в цикле все элементы, либо устанавливать ‘On error resume next’ и после попытки обращения к нужному ключу проверять значение Err.Number (а перед обращением обнулять его через Err.Clear).

Диалог с ChatGPT (несмотря на некоторую неточность моего запроса, бот понял, что именно я хотел спросить):

=================

Почему Microsoft не предусмотрела в коллекциях VBA методов для проверки наличия элемента ?

+++++++++++

Microsoft VBA включает несколько способов проверки наличия элемента в коллекции, такие как использование метода Contains, оператора In и свойства Count. Однако, возможно, вы имеете в виду, что Microsoft не включила методы, которые проверяют наличие элемента по его индексу или ключу.

Один из возможных ответов на этот вопрос может быть связан с тем, что коллекции в VBA реализованы как объекты, которые предоставляют доступ к элементам по ключу или индексу. При использовании коллекции в VBA вы должны знать ключ или индекс элемента, чтобы получить доступ к нему. Если вы не знаете ключ или индекс элемента, вы можете использовать метод Contains или оператор In, чтобы проверить, содержит ли коллекция элемент с определенным значением.

Также следует отметить, что VBA является языком программирования, который был разработан более 25 лет назад. В то время, когда VBA был создан, существовало меньше средств проверки наличия элементов в коллекциях, чем сегодня. С тех пор появилось множество новых языков программирования и библиотек, которые предоставляют более широкие возможности для работы с коллекциями.

=================

В коллекциях VBA нет метода Contains

+++++++++++++

Извините за недостоверную информацию в моем предыдущем ответе. Вы правы, в коллекциях VBA нет метода Contains. Вместо этого, в VBA используется оператор In для проверки наличия элемента в коллекции.

Например, предположим, что у вас есть коллекция, содержащая некоторые значения:

```

Dim myCollection As New Collection

myCollection.Add "apple"

myCollection.Add "banana"

myCollection.Add "orange"

```

Чтобы проверить, содержит ли коллекция элемент "banana", вы можете использовать оператор In следующим образом:

```

If "banana" In myCollection Then

    MsgBox "banana is in the collection"

Else

    MsgBox "banana is not in the collection"

End If

```

Также можно использовать свойство Count, чтобы определить количество элементов в коллекции:

```

If myCollection.Count > 0 Then

    MsgBox "The collection is not empty"

Else

    MsgBox "The collection is empty"

End If

```

Еще раз приношу извинения за предоставленную неверную информацию в моем предыдущем ответе.

=================

Оператор In не принимается VBA, выдаётся сообщение "Syntax error".

++++++++++++++

Приношу извинения за вновь предоставленную неверную информацию. В VBA оператор In не поддерживается для проверки наличия элемента в коллекции, так как коллекции в VBA не являются типом данных, поддерживающим оператор In.

Для проверки наличия элемента в коллекции в VBA можно использовать цикл For Each. Например, предположим, что у вас есть коллекция, содержащая некоторые значения:

```

Dim myCollection As New Collection

myCollection.Add "apple"

myCollection.Add "banana"

myCollection.Add "orange"

```

Чтобы проверить, содержит ли коллекция элемент "banana", вы можете использовать следующий код:

```

Dim item As Variant

Dim found As Boolean

For Each item In myCollection

    If item = "banana" Then

        found = True

        Exit For

    End If

Next

If found Then

    MsgBox "banana is in the collection"

Else

    MsgBox "banana is not in the collection"

End If

```

В этом коде мы перебираем все элементы коллекции с помощью цикла For Each и проверяем, равен ли текущий элемент "banana". Если элемент найден, мы устанавливаем переменную found в значение True и выходим из цикла с помощью оператора Exit For. Затем мы проверяем значение переменной found, чтобы определить, был ли найден элемент "banana".

Еще раз приношу извинения за ранее предоставленные неверные ответы.

=================

Итог: опять с первого раза ответ был совершенно неверный. 

Ситуация 3.

Хочу научиться скриптом определять, какой браузер задан для работы с адресами интернета «по умолчанию».

Диалог с ChatGPT:

=================

Где windows 10 хранит информацию о браузере по умолчанию ?

+++++++++++

Информация о браузере по умолчанию в Windows 10 хранится в реестре. Для доступа к этим настройкам нужно выполнить следующие действия:

1. Нажмите клавиши Win + R, чтобы открыть окно "Выполнить".

2. Введите "regedit" и нажмите Enter, чтобы открыть редактор реестра.

3. Перейдите по следующему пути: HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice

4. В этом разделе вы найдете две ключевые строки: ProgId и Hash. Значение ProgId указывает на программу, которая используется для открытия ссылок по протоколу HTTP, а значение Hash используется для проверки целостности настроек.

5. Аналогично, для доступа к настройкам по протоколу HTTPS нужно перейти по пути HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\https\UserChoice.

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

=================

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

В первых же двух ситуациях бот сначала дал мне совершенно неверную информацию. Такое впечатление, что бот либо нафантазировал те возможные инструменты, которые мог бы сделать разработчик затронутых программных средств, либо, что кажется мне более вероятным, нашёл похожие вопросы в обсуждениях других программных средств и распространил «по аналогии» на обсуждаемую ситуацию. Таким домысливанием нередко приходится заниматься и реальному IT-инженеру – в условиях нехватки теоретических знаний об используемом программном средстве и нехватки времени или возможности на поиск таких знаний.

Вывод: данный бот пока недостаточно умён, чтобы ему можно было доверять, надо предлагаемые им варианты решений обязательно проверять. Вероятно, более продвинутая версия ChatGPT-4 даст лучший результат, но я пользовался свободной версией.