[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] [已解决]求助批处理冷门的功能,set /p拖入文件后自动回车

本帖最后由 tmpuser 于 2022-9-8 11:39 编辑

想实现每拖入一个文件就自动执行而不需要再按回车。

回复 18# idwma


    厉害了老铁 ,实在太感谢了 ,这个乱码整了一天都没弄好。前几天折腾了一个vb程序,但是计算sha256太卡,于是继续回来折腾bat了。

以下是完整代码,功能是拖入文件后计算hash值并复制到剪贴板,送给有同样需求的人:

@echo off
setlocal enabledelayedexpansion
:zzz
set /p=<nul
for /f "delims=" %%i in (
    'powershell "[text.encoding]::default.getstring([byte[]]($(do {[int][console]::ReadKey(1).KeyChar} while ([console]::KeyAvailable))|foreach{if([int]$_ -gt 255){[bitconverter]::GetBytes([int]$_)[0]}else{$_}}))"'
) do echo %%~i&for /f "skip=1 tokens=*" %%a in ('certutil -hashfile %%i SHA256') do (
        echo;!var!<nul|clip
        set var=%%a
        set var=!var: =!
        echo !var!
)
echo.
goto zzz

TOP

双字节字符后8位会串到下一个键
加个判断就好了
  1. @echo off
  2. set/p=拖入文件:<nul
  3. for /f "delims=" %%I in (
  4.     'powershell "[text.encoding]::default.getstring([byte[]]($(do {[int][console]::ReadKey(1).KeyChar} while ([console]::KeyAvailable))|foreach{if([int]$_ -gt 255){[bitconverter]::GetBytes([int]$_)[0]}else{$_}}))"'
  5. ) do set "wj=%%~I"&echo=
  6. echo=%wj%
  7. pause
复制代码
1

评分人数

TOP

回复 16# tmpuser


    看看txt的编码是不是ansi

TOP

本帖最后由 tmpuser 于 2022-9-7 17:08 编辑

回复 13# Blitz


   万分感谢大兄弟,真的可以。只是中文名会乱码无法计算,不知道是不是我系统的问题,PowerShell的编码已经改成936了依然乱码

TOP

回复 13# Blitz

大佬的方法不错,综合处理了下:
  1. @echo off & setlocal enabledelayedexpansion
  2. :run
  3. set/p=拖入文件:<nul
  4. for /f "delims=" %%I in (
  5.     'powershell "do {[void][console]::ReadKey().KeyChar} while ([console]::KeyAvailable)"'
  6. ) do set "wj=%%~I"&echo=
  7. for /f "tokens=1,2 delims=:^ " %%a in ('certutil -hashfile "%wj%" SHA256') do (
  8. set date1=%%a
  9. set date2=%%b
  10. if not defined date2 (echo %wj%  !date1!)
  11. )
  12. goto run
复制代码

TOP

回复 6# flashercs


    拖放完成事件肯定是响应了的,不然数据不会显示在窗口上面,只是还需要一个行缓存结束符。
QQ:1972544783

TOP

试试这样
  1. @echo off
  2. set/p=拖入文件:<nul
  3. for /f "delims=" %%I in (
  4.     'powershell "do {[void][console]::ReadKey().KeyChar} while ([console]::KeyAvailable)"'
  5. ) do set "wj=%%~I"&echo=
  6. echo=%wj%
  7. pause
复制代码
2

评分人数

TOP

回复 10# tmpuser


    就和bat一样存为bat文件来用,简单的当bat来用就是语法不一样
思路就像flash大佬讲的循环拖放消息,就是实现的时候绕了个弯

TOP

最后感谢下4楼和5楼的兄弟,我会参考优化一下代码。

TOP

回复 8# idwma

这是ps1的批处理么,看不太懂

TOP

回复 6# flashercs

明白了。看来只能用其他语言脚本了

TOP

大概像这样
  1. #@&cls&powershell "type '%~0'|out-string|iex"&pause&exit
  2. $Runspace = [runspacefactory]::CreateRunspace()
  3. $PowerShell = [powershell]::Create()
  4. $PowerShell.runspace = $Runspace
  5. $Runspace.Open()
  6. [void]$PowerShell.AddScript({
  7.     while(1){
  8.         if($env:a -ne $null){break}
  9.         sleep 1
  10.     }
  11.     start cmd "/k echo $env:a"
  12. })
  13. $AsyncObject = $PowerShell.BeginInvoke()
  14. while(1){
  15.     $env:a+=[console]::readkey(1).keychar
  16. }
复制代码

TOP

这个懒人游戏也许是如下的脚本》用 vbs/ps/py/c#... 写一个二传手钉在桌面上,当批处理的 set/p 要吃东西时,先把东西丢给二传手,叫他把东西压入直通 set/p 窗口的键盘缓冲区,批处理的 set/p 也许就可以自动吞食了...

TOP

让cmd能响应DragDrop事件,可是cmd没有message loop;没法响应拖拽事件.
微信:flashercs
QQ:49908356

TOP

返回列表