【发布时间】:2018-10-22 09:21:29
【问题描述】:
有没有办法从 php-cli 访问剪贴板?我在 Windows 上特别需要它,但跨平台的解决方案也很好。
【问题讨论】:
标签: php windows cmd command-line-interface clipboard
有没有办法从 php-cli 访问剪贴板?我在 Windows 上特别需要它,但跨平台的解决方案也很好。
【问题讨论】:
标签: php windows cmd command-line-interface clipboard
应该在 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);
}
【讨论】:
$someVar="value";
shell_exec("echo $someVar | clip");
参考:Copy to clipboard from php command line script in Windows 7
【讨论】:
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