【问题标题】:PostgreSQL get disk free space with COPY FROM PROGRAMPostgreSQL 使用 COPY FROM PROGRAM 获取磁盘可用空间
【发布时间】:2020-01-30 22:36:56
【问题描述】:

从 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,并且可能会通过这种模式,但是我错过了一些东西...

【问题讨论】:

    标签: postgresql cmd diskspace


    【解决方案1】:

    您必须声明字符串值需要通过在其前面添加E 来进行转义。在您的情况下,如果您只传递 '\\' 它将被解释为两个字符,这在此函数中是不允许的。看看这个:

    SELECT E'\\', '\\';
    
     ?column? | ?column? 
    ----------+----------
     \        | \\
    (1 Zeile)
    

    【讨论】:

    • 好建议,但报错总是unquoted newline found in data
    • @tmx976 您的文件似乎没有CR-LF。是否可以在导入前对其进行预处理?我怀疑它在行尾只有一个\r,而不是\r\n
    • 这是一个命令行输出,也许其他一些命令行工具可以完成这项工作,但我不知道..我会调查
    • crlf 在 Windows 中可能会很烦人。在这里告诉我们您是如何解决的
    【解决方案2】:

    这是一种获取 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"
    

    【讨论】:

      猜你喜欢
      • 2019-12-12
      • 1970-01-01
      • 2010-11-26
      • 2013-12-05
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多