我想创建一个批处理文件,将文件夹中的所有.out文件复制到剪贴板。 (类似于突出显示多个文件,右键单击并选择复制)。我似乎无法在不知道目的地的情况下找到复制文件的方法。可能吗?
感谢。
答案 0 :(得分:3)
右键单击Windows资源管理器中的文件并选择“复制”时,不会将该文件的路径复制为文本数据。试试吧。右键单击 - 复制桌面上的文件,然后尝试粘贴到记事本或其他文本编辑器中。没什么,对吧?
不,您需要使用某些.NET方法来复制文件指针,以便Windows允许您粘贴以执行文件复制操作。这是通过调用Clipboard.SetFileDropList()
方法完成的。
这是一个公开此方法的批处理+ PowerShell脚本解决方案。用.bat扩展名保存。
<# : batch portion
@echo off & setlocal
set "filemask=*.out"
powershell -STA -noprofile "iex (${%~f0} | out-string)"
goto :EOF
: end batch / begin PowerShell hybrid code #>
$collection = new-object Collections.Specialized.StringCollection
gci $env:filemask | %{ $collection[$collection.Add($_.FullName)] }
Add-Type -AssemblyName System.Windows.Forms
[Windows.Forms.Clipboard]::SetFileDropList($collection)
关注Paul's request,您可以通过regexp进行一些小调整,以便匹配多个扩展程序。
<# : batch portion
@echo off & setlocal
set "rxp=\.(out|dat|log)$"
powershell -STA -noprofile "iex (${%~f0} | out-string)"
goto :EOF
: end batch / begin PowerShell hybrid code #>
$collection = new-object Collections.Specialized.StringCollection
gci | ?{ $_.Name -match $env:rxp } | %{ $collection[$collection.Add($_.FullName)] }
Add-Type -AssemblyName System.Windows.Forms
[Windows.Forms.Clipboard]::SetFileDropList($collection)
只是因为我觉得接受LinuxDisciple's challenge,这是一个从命令行接受文件掩码的解决方案。
<# : batch portion
@echo off & setlocal
if "%~1"=="" (
echo Usage: %~nx0 filemask [filemask [filemask [...]]]
echo example: %~nx0 *.jpg *.gif *.bmp
goto :EOF
)
(for %%I in ("%~f0";%*) do @for %%# in ("%%~I") do @echo(%%~f#) | ^
powershell -STA -noprofile "$argv = $input | ?{$_}; iex (${%~f0} | out-string)"
goto :EOF
: end batch / begin powershell #>
$col = new-object Collections.Specialized.StringCollection
$argv[1..($argv.length-1)] | ?{$_.length -gt 3 -and (test-path $_)} | %{$col[$col.Add($_)]}
if ($col.Count) {
Add-Type -AssemblyName System.Windows.Forms
[Windows.Forms.Clipboard]::SetFileDropList($col)
}
答案 1 :(得分:2)
见Access clipboard in Windows batch file
它使用.getData从剪贴板获取信息,但是还有.setData
选项,允许您使用文件数据填充复制/粘贴缓冲区。您的问题的答案是,没有办法直接使用批处理,但使用此WSH黑客,您至少可以避免使用Windows外部的工具。
答案 2 :(得分:1)
SPOOL
将连接* .out文件并将结果放在剪贴板上。