PostgreSQL получить свободное место на диске с помощью COPY FROM PROGRAM - PullRequest
2 голосов
/ 30 января 2020

Начиная с версии 9.3, в таблицу можно импортировать вывод командной строки. Я использую windows, и я хотел бы импортировать во (временную) таблицу вывод

wmic logicaldisk get size, freespace, caption

Caption  FreeSpace     Size
C:       7454072832    118087389184
D:       151787872256  484033048576
E:
F:       110551040     625094656
G:       136850108416  481803997184
V:       272621289472  990730260480
X:       272621289472  990730260480
Y:       272621289472  990730260480

Я попытался запрос

CREATE TABLE IF NOT EXISTS _disks(row text);
TRUNCATE TABLE _disks;
COPY _disks FROM PROGRAM 'wmic logicaldisk get size, freespace, caption' ESCAPE '\\' CSV;
SELECT * FROM _disks;

ERROR: COPY escape must be a single one-byte character

Затем я попытался

COPY _disks FROM PROGRAM 'wmic logicaldisk get size, freespace, caption' ESCAPE '\' CSV;

ERROR: unquoted newline found in data

затем снова

COPY _disks FROM PROGRAM 'wmic logicaldisk get size, freespace, caption';

ERROR: unquoted newline found in data

Я пробовал другое решение, но я застрял.

Любое предложение?

РЕДАКТИРОВАТЬ:

может быть, что-то подобное может приблизить меня, но недостаточно

COPY _disks FROM PROGRAM 'for /f "tokens=*" %F in (''wmic logicaldisk get size^, freespace^, caption'') do @echo %F';

Я думаю, что есть способ изменить EOL и, возможно, пройти через этот шаблон, но я что-то упускаю ...

Ответы [ 2 ]

1 голос
/ 30 января 2020

Вы должны указать, что строковое значение необходимо экранировать, добавив E прямо перед ним. В вашем случае, если вы передадите только '\\', это будет интерпретировано как два символа, что недопустимо в этой функции. Проверьте это:

SELECT E'\\', '\\';

 ?column? | ?column? 
----------+----------
 \        | \\
(1 Zeile)
0 голосов
/ 30 января 2020

Вот способ получить файл CSV. Есть способы записи в базу данных, но я предполагаю, что есть много способов импортировать уже известный файл CSV.

Get-CimInstance -ClassName CIM_LogicalDisk |
    Select-Object -Property DeviceID,FreeSpace,Size |
    ConvertTo-Csv -NoTypeInformation -Delimiter ',' |
    Out-File -FilePath 'ld.txt' -Encoding ascii

Это можно использовать в сценарии файла cmd.exe .bat.

powershell -NoLogo -NoProfile -Command ^
    "Get-CimInstance -ClassName CIM_LogicalDisk |" ^
        "Select-Object -Property DeviceID,FreeSpace,Size |" ^
        "ConvertTo-Csv -NoTypeInformation -Delimiter ',' |" ^
        "Out-File -FilePath 'ld.txt' -Encoding ascii"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...