Разница между эхом PowerShell и эхом CMD - PullRequest
2 голосов
/ 11 апреля 2020

В PowerShell я получаю следующее:

D:\> echo "Apple Pie" | git hash-object --stdin
157cb7be4778a9cfad23b6fb514e364522167053

D:\> "Apple Pie" | git hash-object --stdin
157cb7be4778a9cfad23b6fb514e364522167053

, но в CMD.exe:

C:\>echo "Apple Pie" | git hash-object --stdin
bb3918d5053fea31fc9a58fae1e5bdeabe3ec647

В видео PluralSight я вижу значение, отличное от того, что кажется Ma c консоль:

enter image description here

Каково точное значение, полученное из echo в каждом случае?

Я получаю другое га sh, если я go, для одного из этих онлайн-генераторов SHA1 и введите строку Apple Pie. Из тех, что я получаю:

8d69b7365f59237d3fb052c1f2f15ea33457fe51

1 Ответ

2 голосов
/ 11 апреля 2020

Насколько я понимаю:

Использование CMD:

echo Apple Pie|git hash-object --stdin

возвращает то же самое, что и следующее в PowerShell

"Apple Pie" | git hash-object --stdin

То есть:

157cb7be4778a9cfad23b6fb514e364522167053

@ Mofi, кажется, прав, вы можете воспроизвести результат CMD в Powershell, используя:

'"Apple Pie" ' | git hash-object --stdin

Чтобы объяснить Ma c OS one: Получить 157cb7be4778a9cfad23b6fb514e364522167053 реальный список символов, который хэшируется: 'Apple Pie\r\n' (с переводом строки возврата carage), в Ma c или linux, как в командной строке, это 'Apple Pie\r'.

Если вы хотите проверить это: поместите 'Apple Pie' в текстовый файл с возвратом кариеса и сохраните его как Windows текстовый стиль (CR + LF) и используйте git hash-object yourfile.txt. Затем сохраните его в стиле Linux (LF) и протестируйте снова, вы найдете два хэша.


Часть о \ r \ n.

"Apple Pie" | where {$_.length -eq 9} показывает, что длина строки ровно 9 символов

Для меня это потому, что в вашем случае канал находится между двумя частями PowerShell, канал передает объект. Когда канал находится между PowerShell и внешним EXE-файлом, тогда добавляются \ r \ n. Вот способ проверить это с помощью небольшого exe-файла, записанного в C#:

using System;
namespace C_Param
{
  class Program
  {
    static void Main(string[] args)
    {
      string line = Console.In.ReadToEnd();
      foreach (char character in line){
        Console.WriteLine(String.Format("{0:X2}", Convert.ToByte(character)));
      }
    }
  }
}

Результат в консоли PowerShell:

"Apple Pie" | .\C_Param.exe
41
70
70
6C
65
20
50
69
65
0D
0A

Результат в консоли CMD это:

echo "Apple Pie" | .\C_Param.exe
22
41
70
70
6C
65
20
50
69
65
22
20
0D
0A

КЭД?

...