phpwindowscmdcommand-line-interfaceclipboard

Access clipboard from php-cli?


Is there some way to access the clipboard from php-cli? I particularly need it for Windows, but a cross-platform solution would be good too.


Solution

  • portable function that should work on Windows 7+ (PowerShell 2+), X.org-based linux systems, and 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.");
        }
    }
    

    as for writing TO the clipboard:

    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 and WSL2 Ubuntu
            $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);
    }