PowerShell tee-Object генерирует пустые строки в выводе, когда используется в командах db2 - PullRequest
1 голос
/ 30 апреля 2020

Когда я использую командлет powershell tee-object для сохранения вывода в файл, между каждой фактической строкой создаются пустые строки. Вывод становится удвоенным и уродливым как в выводе на экран, так и в перенаправленном файле.

обычная команда, а вывод:

# db2 connect to sample

   Database Connection Information

 Database server        = DB2/NT64 11.5.0.0
 SQL authorization ID   = SAMUEL
 Local database alias   = SAMPLE

, но при использовании Tee-Object против этого ... вот что происходит:

# db2 connect to sample |  Tee-Object test.out


   Database Connection Information



 Database server        = DB2/NT64 11.5.0.0

 SQL authorization ID   = SAMUEL

 Local database alias   = SAMPLE

В выводе на экран, а также в сгенерированном файле скважина:

# type test.out


   Database Connection Information



 Database server        = DB2/NT64 11.5.0.0

 SQL authorization ID   = SAMUEL

 Local database alias   = SAMPLE

--- edit - - @ js2010, вот весь шестнадцатеричный формат для лучшего чтения. Не могу правильно вставить его в комментарии.

# format-hex test.out


           Path: E:\PowerShell_Tests\db2mon\test.out

           00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000   FF FE 0D 00 0A 00 0D 00 0A 00 20 00 20 00 20 00  .þ........ . . .
00000010   44 00 61 00 74 00 61 00 62 00 61 00 73 00 65 00  D.a.t.a.b.a.s.e.
00000020   20 00 43 00 6F 00 6E 00 6E 00 65 00 63 00 74 00   .C.o.n.n.e.c.t.
00000030   69 00 6F 00 6E 00 20 00 49 00 6E 00 66 00 6F 00  i.o.n. .I.n.f.o.
00000040   72 00 6D 00 61 00 74 00 69 00 6F 00 6E 00 0D 00  r.m.a.t.i.o.n...
00000050   0A 00 0D 00 0A 00 0D 00 0A 00 0D 00 0A 00 20 00  .............. .
00000060   44 00 61 00 74 00 61 00 62 00 61 00 73 00 65 00  D.a.t.a.b.a.s.e.
00000070   20 00 73 00 65 00 72 00 76 00 65 00 72 00 20 00   .s.e.r.v.e.r. .
00000080   20 00 20 00 20 00 20 00 20 00 20 00 20 00 3D 00   . . . . . . .=.
00000090   20 00 44 00 42 00 32 00 2F 00 4E 00 54 00 36 00   .D.B.2./.N.T.6.
000000A0   34 00 20 00 31 00 31 00 2E 00 35 00 2E 00 30 00  4. .1.1...5...0.
000000B0   2E 00 30 00 0D 00 0A 00 0D 00 0A 00 20 00 53 00  ..0......... .S.
000000C0   51 00 4C 00 20 00 61 00 75 00 74 00 68 00 6F 00  Q.L. .a.u.t.h.o.
000000D0   72 00 69 00 7A 00 61 00 74 00 69 00 6F 00 6E 00  r.i.z.a.t.i.o.n.
000000E0   20 00 49 00 44 00 20 00 20 00 20 00 3D 00 20 00   .I.D. . . .=. .
000000F0   53 00 41 00 4D 00 55 00 45 00 4C 00 0D 00 0A 00  S.A.M.U.E.L.....
00000100   0D 00 0A 00 20 00 4C 00 6F 00 63 00 61 00 6C 00  .... .L.o.c.a.l.
00000110   20 00 64 00 61 00 74 00 61 00 62 00 61 00 73 00   .d.a.t.a.b.a.s.
00000120   65 00 20 00 61 00 6C 00 69 00 61 00 73 00 20 00  e. .a.l.i.a.s. .
00000130   20 00 20 00 3D 00 20 00 53 00 41 00 4D 00 50 00   . .=. .S.A.M.P.
00000140   4C 00 45 00 0D 00 0A 00 0D 00 0A 00 0D 00 0A 00  L.E.............
00000150   0D 00 0A 00                                      ....

Кроме того, ваш 2-й тест показывает, что проблема заключается не в использовании командлета tee-object, а в том, что его просто обнуляет вывод ...

Другая информация, если я выполнить перенаправление в файл из обычного окна windows cmd, проблема не возникает,

из окна cmd:

E:\PowerShell_Tests\db2mon>db2 connect to sample > cmd.out

E:\PowerShell_Tests\db2mon>type cmd.out

   Database Connection Information

 Database server        = DB2/NT64 11.5.0.0
 SQL authorization ID   = SAMUEL
 Local database alias   = SAMPLE

, но, выполнив тот же редирект из сеанса powershell, снова создал двойные строки:

# db2 connect to sample > pwsh.out
PS [Samuel]E:\PowerShell_Tests\db2mon
# Get-Content pwsh.out


   Database Connection Information



 Database server        = DB2/NT64 11.5.0.0

 SQL authorization ID   = SAMUEL

 Local database alias   = SAMPLE

--- end edit ---

--- edit 2 --- @ js2010

# db2 connect to sample | format-hex


           00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000   20 20 20 44 61 74 61 62 61 73 65 20 43 6F 6E 6E     Database Conn
00000010   65 63 74 69 6F 6E 20 49 6E 66 6F 72 6D 61 74 69  ection Informati
00000020   6F 6E                                            on


           00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000   20 44 61 74 61 62 61 73 65 20 73 65 72 76 65 72   Database server
00000010   20 20 20 20 20 20 20 20 3D 20 44 42 32 2F 4E 54          = DB2/NT
00000020   36 34 20 31 31 2E 35 2E 30 2E 30                 64 11.5.0.0


           00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000   20 53 51 4C 20 61 75 74 68 6F 72 69 7A 61 74 69   SQL authorizati
00000010   6F 6E 20 49 44 20 20 20 3D 20 53 41 4D 55 45 4C  on ID   = SAMUEL



           00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000   20 4C 6F 63 61 6C 20 64 61 74 61 62 61 73 65 20   Local database
00000010   61 6C 69 61 73 20 20 20 3D 20 53 41 4D 50 4C 45  alias   = SAMPLE

--- end edit 2 ---

Кто-нибудь знает, что происходит, и как я могу это "исправить"?

Спасибо

Ответы [ 2 ]

1 голос
/ 02 мая 2020

для других администраторов баз данных Db2 , пытающихся использовать powershell в качестве меня ..

Я создал этот небольшой хак, чтобы справиться с этим для всех моих db2 пс сессий.

Измените свой профиль пользователя powershell, создав функцию и псевдоним, как указано выше:

$ Главная [Мои] Документы \ PowerShell \ Microsoft.PowerShell_profile.ps1:

# db2 settings for powershell
Set-Item -Path env:DB2CLP -value "**$$**"

# Handle db2 output, avoiding doubled lines due 'CRCRLF' pattern
Function Handle-Db2 {
    $i = 0
    db2 $args | Where-Object { ++$i % 2 }
}

New-Alias -Name "db2ps" Handle-Db2

Теперь, если вы хотите использовать взломанную версию, вместо вызова db2 .... вы можете использовать db2ps ... и получить правильный вывод.

# db2ps describe table employee | Tee-Object employee.out

                                Data type                     Column
Column name                     schema    Data type name      Length     Scale Nulls
------------------------------- --------- ------------------- ---------- ----- ------
EMPNO                           SYSIBM    CHARACTER                    6     0 No
FIRSTNME                        SYSIBM    VARCHAR                     12     0 No
MIDINIT                         SYSIBM    CHARACTER                    1     0 Yes
LASTNAME                        SYSIBM    VARCHAR                     15     0 No
WORKDEPT                        SYSIBM    CHARACTER                    3     0 Yes
PHONENO                         SYSIBM    CHARACTER                    4     0 Yes
HIREDATE                        SYSIBM    DATE                         4     0 Yes
JOB                             SYSIBM    CHARACTER                    8     0 Yes
EDLEVEL                         SYSIBM    SMALLINT                     2     0 No
SEX                             SYSIBM    CHARACTER                    1     0 Yes
BIRTHDATE                       SYSIBM    DATE                         4     0 Yes
SALARY                          SYSIBM    DECIMAL                      9     2 Yes
BONUS                           SYSIBM    DECIMAL                      9     2 Yes
COMM                            SYSIBM    DECIMAL                      9     2 Yes

  14 record(s) selected.


# db2ps describe table employee | Select-String "DEC"

SALARY                          SYSIBM    DECIMAL                      9     2 Yes
BONUS                           SYSIBM    DECIMAL                      9     2 Yes
COMM                            SYSIBM    DECIMAL                      9     2 Yes

Было бы неплохо, если бы IBM исправила это странное поведение CRCRLF для команд db2 на windows. Пока этого не произойдет, наслаждайтесь!

С уважением

1 голос
/ 02 мая 2020

Как следует из вывода Format-Hex, db2 - причудливо - использует CRCRLF ("`r`r`n" в терминах PowerShell), а не обычные последовательности CRLF ("`r`n") в качестве новых строк (для разделения его строки вывода) - это поведение , которое оно разделяет с sfc.exe.

При печати на дисплее эта аномалия не проявляется, но возникает когда вы захватываете или перенаправляете вывод, например, через Tee-Object.

Обходной путь состоит в исключении каждой другой строки , которая отбрасывает дополнительные строки, которые возникают в результате того, что PowerShell интерпретирует CR ("`r") сам по себе как новую строку:

$i = 0
db2 ... | Where-Object { ++$i % 2 } | Tee-Object test.out

Обновление : с тех пор вы предоставили удобная функция оболочки на основе этого решения в вашем собственном ответе .

...