Board logo

标题: [注册表类] [已解决]把批处理改为用右键写入注册表键值里去执行,有些命令会不被被执行吗,如for [打印本页]

作者: lforl    时间: 2023-2-2 21:27     标题: [已解决]把批处理改为用右键写入注册表键值里去执行,有些命令会不被被执行吗,如for

本帖最后由 lforl 于 2023-2-4 13:10 编辑

【案例】右键文件夹实现:根据指定列表文本,给指定文件名加上前缀字符:

文件夹“book Zip Test”里有以下文件:
F:\book Zip Test\noPsw03.zip
F:\book Zip Test\noPsw04.zip
F:\book Zip Test\Psw01.zip
F:\book Zip Test\Psw02.zip
F:\book Zip Test\Psw03.zip
F:\book Zip Test\Psw04.zip
F:\book Zip Test\Psw05.zip
F:\book Zip Test\Psw06is.zip
F:\book Zip Test\sub floder\zip test.zip
F:\book Zip Test\sub floder\noPsw01.zip
F:\book Zip Test\sub floder\noPsw02.zip
列表文本“zipList.txt”内容为:
  1. F:\book Zip Test\noPsw04.zip
  2. F:\book Zip Test\Psw01.zip
  3. F:\book Zip Test\Psw02.zip
  4. F:\book Zip Test\sub floder\zip test.zip
复制代码
右键文件夹,根据以上列表内容,修改文件名为:
F:\book Zip Test\(已加密)noPsw04.zip
F:\book Zip Test\(已加密)Psw01.zip
F:\book Zip Test\(已加密)Psw02.zip
F:\book Zip Test\sub floder\(已加密)zip test.zip

我写了一个zipRename.bat:
  1. for /f "tokens=*" %%i in (zipList.txt) do (ren "%%i" "(已加密)%%~nxi")
复制代码
然后用注册表调用这个bat,实现右键改名,是可以的:
  1. [HKEY_CLASSES_ROOT\Directory\shell\copypath\command]
  2. @="cmd.exe /K cd /d %L &zipRename.bat &exit"
复制代码
---------
问题:如果我抛弃中间bat,直接将那行for循环,写入到注册表,右键使用,没有执行,也没报错,为何?
  1. [HKEY_CLASSES_ROOT\Directory\shell\copypath\command]
  2. @="cmd.exe /K cd /d %L &for /f \"tokens=*\" %%i in (zipList.txt) do (ren \"%%i\" \"(已加密)%%~nxi\")&exit"
复制代码
批处理放到注册表键值里去执行,仅局限部分命令有效吗?

我发现在不同环境里,参数的写法不一样:

在cmd窗口中:for %I in (command1) do command2
在批处理文件中:for %%I in (command1) do command2
在注册表键值中:for %%I in (command1) do command2


把批处理改为用右键(写入注册表键值里)去执行,为什么有些命令就没效果,比如for
是不是很多批处理文件,都不能写入注册表键值中,用右键执行?

把批处理改为用reg(写入注册表键值里)做一个右键菜单去执行,有什么改写规则吗?
已知的比如有:
* 引号要加斜杠\转义
* 换行(两个命令之间)要用&链接
* win7下%1可以代表当前文件夹,win10下要改为%L才有效果。
......
这个帖子就提到几个参数的变化
作者: WHY    时间: 2023-2-3 22:16

本帖最后由 WHY 于 2023-2-3 22:19 编辑

@="cmd.exe /K cd /d %L &for /f \"tokens=*\" %%i in (zipList.txt) do (ren \"%%i\" \"(已加密)%%~nxi\")&exit"
这个括弧位置不对,执行一次 ren 就会退出CMD。
改成这样:
@="cmd.exe /K cd /d %L &(for /f \"tokens=*\" %%i in (zipList.txt) do ren \"%%i\" \"(已加密)%%~nxi\")&exit"
win7、win10测试没有问题。
作者: Batcher    时间: 2023-2-4 08:59

回复 1# lforl


win7下%1可以代表当前文件夹,win10下要改为%L才有效果。

不管什么系统,不管在哪里(bat/cmd/reg)使用,for循环的控制变量建议都使用字母而不是数字。
作者: lforl    时间: 2023-2-4 12:45

本帖最后由 lforl 于 2023-2-4 13:11 编辑

非常感谢@WHY 、@Batcher帮助与点评!学到了,问题解决!看来所有的批处理,只要编写得当,都可以写入注册表里用右键去执行!




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2