从Windows 7中的php命令行脚本复制到剪贴板

时间:2015-11-25 20:40:27

标签: php windows

我有一个php(5.5)脚本,我从Windows 7的命令行运行。像这样:

C:\php-5.5.5\php.exe C:\scripts\putString.php

我的问题是,是否可以从脚本中将某些内容复制到Windows剪贴板?我希望用户在从命令行运行此脚本后,在剪贴板中提供了一些文本。怎么办呢?

3 个答案:

答案 0 :(得分:4)

如果要将一些中间结果添加到剪贴板,而不是整个脚本的输出

//...your script...
$someVar="value";
shell_exec("echo $someVar | clip");
//rest of script...

答案 1 :(得分:1)

使用剪辑:

C:\php-5.5.5\php.exe C:\scripts\putString.php | clip

答案 2 :(得分:0)

首先我想指出@chiliNUT 的解决方案并不安全,例如容易受到 shell 注入

$someVar="foo | del /S C:\windows\system123";
shell_exec("echo $someVar | clip");

将尝试删除您的 C:\windows\system123 文件夹,因为命令变为

echo foo | del /S C:\windows\system123 | clip

...

这是一个可移植的函数,它应该可以在 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);
}