标题: [文件操作] [已解决]求助批处理冷门的功能,set /p拖入文件后自动回车 [打印本页]
作者: tmpuser 时间: 2022-8-31 10:48 标题: [已解决]求助批处理冷门的功能,set /p拖入文件后自动回车
本帖最后由 tmpuser 于 2022-9-8 11:39 编辑
想实现每拖入一个文件就自动执行而不需要再按回车。
作者: Batcher 时间: 2022-8-31 16:22
回复 1# tmpuser
请说明一下真实的完整需求吧,也许可以把 set /p 换成其它方式。
作者: tmpuser 时间: 2022-8-31 19:55
回复 2# Batcher
好的。就是打开bat窗口拖入文件后不用按确定键就能自动计算hash值,主要就是不想再多按一下回车。我搜了以前的求助帖好像都没有特别好的解决方法,不知道vbs能不能实现。
代码就是这些:
@echo off
setlocal enabledelayedexpansion
:zzz
set /p xxx=文件名:
certutil -hashfile %xxx% SHA256
echo.
goto zzz
作者: yakeyun 时间: 2022-8-31 21:45
回复 1# tmpuser
版本一,拖放文件到批处理上,直接生成“SHA256.txt”文件,里面自动顺序记录下文件名和SHA256值:- @echo off
- cd /d "%~dp0"
- setlocal enabledelayedexpansion
- chcp 936 >nul
- set file=%~fx1
- set filegs=%file:~-3%
- set wfiles=%file%
- for /f "tokens=1,2 delims=:^ " %%a in ('certutil -hashfile "%wfiles%" SHA256') do (
- set date1=%%a
- set date2=%%b
- if not defined date2 (echo %file% !date1!)
- ) >>SHA256.txt
- exit
复制代码
版本二 只记录SHA256值,不记录文件名。- @echo off
- cd /d "%~dp0"
- setlocal enabledelayedexpansion
- chcp 936 >nul
- set file=%~fx1
- set filegs=%file:~-3%
- set wfiles=%file%
- for /f "tokens=1,2 delims=:^ " %%a in ('certutil -hashfile "%wfiles%" SHA256') do (
- set date1=%%a
- set date2=%%b
- if not defined date2 (echo !date1!)
- ) >>SHA256.txt
- exit
复制代码
作者: fzp070 时间: 2022-8-31 21:56
回复 3# tmpuser
拖入文件自动回车我也不会,希望有高人指点。不过可以采用 在待计算Hash值文件上右键运行 【Hash值计算】的批处理进行自动计算,代码如下:- @echo off
- title 计算文件Hash值
- setlocal enabledelayedexpansion
- del /f/q hash.txt>nul 2>nul
-
- set paths1=%1
- set paths1=%paths1%
-
- :zzz
- echo 文件名:%paths1%
- certutil -hashfile %paths1% SHA256>hash.txt
- certutil -hashfile %paths1% SHA1>>hash.txt
- certutil -hashfile %paths1% MD5>>hash.txt
- echo.
-
- set /a row=0
- for /f "tokens=*" %%i in (hash.txt) do (
- set /a row+=1
- if !row!==2 echo SHA256值:%%i
- if !row!==5 echo SHA1值:%%i
- if !row!==8 echo MD5值:%%i
- )
-
- del /f/q hash.txt>nul 2>nul
- echo.
-
- :kkk
- set paths1=>nul
- set /p paths1=继续拖放文件:
-
- echo %paths1%|find /i /c ":" >nul&&goto kk1
- goto kkk
- :kk1
- echo %paths1%|find /i /c "\" >nul&&goto kk2
- goto kkk
- :kk2
- goto zzz
复制代码
注,以上代码在计算完右键的文件Hash值后,会提示继续拖放文件计算Hash,仍是需要按键才能下一步的,如果不需要继续,就将:kkk至:kkk2的内容删除即可。
添加右键的代码如下:- @echo off
- ::chcp 65001>nul
- echo 请鼠标右键【以管理员身份运行】,否则将报错:拒绝访问!
- echo.
- cd /d "%~dp0"
-
-
- reg add HKEY_CLASSES_ROOT\*\shell\===Hash值计算(MD5)=== /f
- reg add HKEY_CLASSES_ROOT\*\shell\===Hash值计算(MD5)===\command /f
- reg add HKEY_CLASSES_ROOT\*\shell\===Hash值计算(MD5)===\command /f /d "\"%~dp0右键计算Hash值.bat\" \"%%1\""
-
-
- echo.echo.&echo 导入成功,程序1秒后退出!
- ping 127.1 -t -n 4 >nul
- exit
复制代码
作者: flashercs 时间: 2022-9-1 11:33
让cmd能响应DragDrop事件,可是cmd没有message loop;没法响应拖拽事件.
作者: aloha20200628 时间: 2022-9-1 19:04
这个懒人游戏也许是如下的脚本》用 vbs/ps/py/c#... 写一个二传手钉在桌面上,当批处理的 set/p 要吃东西时,先把东西丢给二传手,叫他把东西压入直通 set/p 窗口的键盘缓冲区,批处理的 set/p 也许就可以自动吞食了...
作者: idwma 时间: 2022-9-2 00:24
大概像这样- #@&cls&powershell "type '%~0'|out-string|iex"&pause&exit
- $Runspace = [runspacefactory]::CreateRunspace()
- $PowerShell = [powershell]::Create()
- $PowerShell.runspace = $Runspace
- $Runspace.Open()
- [void]$PowerShell.AddScript({
- while(1){
- if($env:a -ne $null){break}
- sleep 1
- }
- start cmd "/k echo $env:a"
- })
- $AsyncObject = $PowerShell.BeginInvoke()
- while(1){
- $env:a+=[console]::readkey(1).keychar
- }
复制代码
作者: tmpuser 时间: 2022-9-2 09:52
回复 6# flashercs
明白了。看来只能用其他语言脚本了
作者: tmpuser 时间: 2022-9-2 10:01
回复 8# idwma
这是ps1的批处理么,看不太懂
作者: tmpuser 时间: 2022-9-2 10:02
最后感谢下4楼和5楼的兄弟,我会参考优化一下代码。
作者: idwma 时间: 2022-9-2 15:18
回复 10# tmpuser
就和bat一样存为bat文件来用,简单的当bat来用就是语法不一样
思路就像flash大佬讲的循环拖放消息,就是实现的时候绕了个弯
作者: Blitz 时间: 2022-9-7 04:06
试试这样- @echo off
- set/p=拖入文件:<nul
- for /f "delims=" %%I in (
- 'powershell "do {[void][console]::ReadKey().KeyChar} while ([console]::KeyAvailable)"'
- ) do set "wj=%%~I"&echo=
- echo=%wj%
- pause
复制代码
作者: Gin_Q 时间: 2022-9-7 08:41
回复 6# flashercs
拖放完成事件肯定是响应了的,不然数据不会显示在窗口上面,只是还需要一个行缓存结束符。
作者: yakeyun 时间: 2022-9-7 09:08
回复 13# Blitz
大佬的方法不错,综合处理了下:- @echo off & setlocal enabledelayedexpansion
- :run
- set/p=拖入文件:<nul
- for /f "delims=" %%I in (
- 'powershell "do {[void][console]::ReadKey().KeyChar} while ([console]::KeyAvailable)"'
- ) do set "wj=%%~I"&echo=
- for /f "tokens=1,2 delims=:^ " %%a in ('certutil -hashfile "%wj%" SHA256') do (
- set date1=%%a
- set date2=%%b
- if not defined date2 (echo %wj% !date1!)
- )
- goto run
复制代码
作者: tmpuser 时间: 2022-9-7 17:07
本帖最后由 tmpuser 于 2022-9-7 17:08 编辑
回复 13# Blitz
万分感谢大兄弟,真的可以。只是中文名会乱码无法计算,不知道是不是我系统的问题,PowerShell的编码已经改成936了依然乱码
作者: Blitz 时间: 2022-9-7 20:26
回复 16# tmpuser
看看txt的编码是不是ansi
作者: idwma 时间: 2022-9-7 20:27
双字节字符后8位会串到下一个键
加个判断就好了- @echo off
- 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 set "wj=%%~I"&echo=
- echo=%wj%
- pause
复制代码
作者: tmpuser 时间: 2022-9-7 21:10
回复 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
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |