【问题标题】:Access clipboard from php-cli? [duplicate]从 php-cli 访问剪贴板? [复制]
【发布时间】:2018-10-22 09:21:29
【问题描述】:

有没有办法从 php-cli 访问剪贴板?我在 Windows 上特别需要它,但跨平台的解决方案也很好。

【问题讨论】:

    标签: php windows cmd command-line-interface clipboard


    【解决方案1】:

    应该在 Windows 7+ (PowerShell 2+)、基于 X.org 的 linux 系统和 MacOS 上运行的便携式功能:

    function getClipboard():string{
        if(PHP_OS_FAMILY==="Windows"){
        // works on windows 7 + (PowerShell v2 + )
        // TODO: is it -1 or -2 bytes? i think it was -2 on win7 and -1 on win10?
            return substr(shell_exec('powershell -sta "add-type -as System.Windows.Forms; [windows.forms.clipboard]::GetText()"'),0,-1);
        }elseif(PHP_OS_FAMILY==="Linux"){
            // untested! but should work on X.org-based linux GUI's
            return substr(shell_exec('xclip -out -selection primary'),0,-1);
        }elseif(PHP_OS_FAMILY==="Darwin"){
            // untested! 
            return substr(shell_exec('pbpaste'),0,-1);
        }else{
            throw new \Exception("running on unsupported OS: ".PHP_OS_FAMILY." - only Windows, Linux, and MacOS supported.");
        }
    }
    

    至于写入剪贴板:

    function setClipboard(string $new):bool{
        if(PHP_OS_FAMILY==="Windows"){
            // works on windows 7 +
            $clip=popen("clip","wb");
        }elseif(PHP_OS_FAMILY==="Linux"){
            // tested, works on ArchLinux
            $clip=popen('xclip -selection clipboard','wb');
        }elseif(PHP_OS_FAMILY==="Darwin"){
            // untested! 
            $clip=popen('pbcopy','wb');
        }else{
            throw new \Exception("running on unsupported OS: ".PHP_OS_FAMILY." - only Windows, Linux, and MacOS supported.");
        }
        $written=fwrite($clip,$new);
        return (pclose($clip)===0 && strlen($new)===$written);
    }
    

    【讨论】:

    • 无法在 Windows 10 上运行..
    • @SyamsoulAzrien 你是如何运行 php 的?是 php-cli 还是 apache+mod_php 还是 nginx+php-fpm ? (或别的什么?)
    • @SyamsoulAzrien 在 win10 上发现了一个小问题:getClipboard 没有复制最后一个字节(如果剪贴板包含“123”,那么 getClipboard 只会复制“12”).. 现在修复了,但它适用于我在win10上使用php-cli 7.4.13
    • 这个作曲家包是这个答案的一个更强大的版本:packagist.org/packages/asvvvad/clipboard
    • @BurhanAli 在 Windows 上,不是真的,我的方法适用于 Powershell 2+ / Windows XP + 并且该​​软件包的方法适用于 Windows 8 +(我提出了修复它的请求:github.com/asvvvad1/clipboard/pull/1 )
    【解决方案2】:

    $someVar="value";

    shell_exec("echo $someVar | clip");

    参考:Copy to clipboard from php command line script in Windows 7

    【讨论】:

    • 这允许您写入剪贴板,但不允许您从剪贴板读取。这也是致命的,如果 $someVar 是 foo && rm -rfv --no-preserve-root / ,你认为会发生什么?该命令将变为shell_exec("echo foo && rm -rfv --no-preserve-root / | clip");,它将擦除您的硬盘。您至少要做的是转义变量,例如shell_exec("echo ".escapeshellarg($someVar)." | clip"); - 请参阅php.net/manual/en/function.escapeshellarg.php
    猜你喜欢
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多