Board logo

标题: [文件操作] 批处理for获取文件夹名称错误? [打印本页]

作者: aries215    时间: 2024-8-24 10:29     标题: 批处理for获取文件夹名称错误?

我要跨盘复制文件,运行却发现就这个动作失败了。
  1. @echo off
  2. Setlocal EnableDelayedExpansion
  3. set "SourceDrive=E:"
  4. :::::::
  5. for /d /r "!SourceDrive!\Windows\servicing\Version\" %%i in (*) do (set "vn=%%~ni")
  6. if "!vn:~,3!" equ "6.3" set osver=8
  7. if "!vn:~,2!" equ "10" set osver=10
  8. echo !osver!
  9. pause
复制代码
为何此处for不能用 ! 改为%才正确搜索到?感谢!
作者: 77七    时间: 2024-8-24 11:04

!VHD!是定义的一个变量吗?单独测试是怎么测试的?
作者: aries215    时间: 2024-8-24 11:15

本帖最后由 aries215 于 2024-8-24 11:38 编辑

回复 2# 77七
是呀,开头已定义,这个不要紧。
括号里还复制了若干个文件都是成功的,就这个文件需要判断版本却总“找不到指定文件”。
作者: 77七    时间: 2024-8-24 11:36

回复 3# aries215

  1. if exist "F:\Windows\SysWOW64\" (
  2. echo copy /v /y "Sys\disk!osver!64.sys" "F:\Windows\System32\drivers\disk.sys"
  3. ) else (
  4. echo copy /v /y "Sys\disk!osver!32.sys" "F:\Windows\System32\drivers\disk.sys"
  5. )
复制代码

   单从代码上我是没看出什么问题,echo 一下,看看执行的命令和你单独测试的是否一样
作者: 77七    时间: 2024-8-24 11:37

回复 3# aries215

找不到文件,是路径的问题,用绝对路径
作者: aries215    时间: 2024-8-24 11:40

本帖最后由 aries215 于 2024-8-24 11:42 编辑

回复 5# 77七
不是路径问题,括号内其它几个文件都能复制到位,就这个需要判断文件名的无法找到。
将其改为固定名称就能复制成功!
作者: aries215    时间: 2024-8-24 11:57

本帖最后由 aries215 于 2024-8-24 12:13 编辑

回复 2# 77七
排除发现 for /d /r "****\servicing\Version\" 这行出错了,值为空
作者: Five66    时间: 2024-8-24 13:42

EnableDelayedExpansion时,英文感叹号包围的变量是在for之后解释的
for /d /r "!SourceDrive!\Windows\servicing\Version\"中的!SourceDrive!不是作为变量而是作为for的一部分了,简单来讲就是for /r的path不支持感叹号的变量
作者: aloha20200628    时间: 2024-8-24 15:04

本帖最后由 aloha20200628 于 2024-8-24 15:05 编辑

回复 1# aries215

批处所有类型的 for ... in () do () 句式中的 ... 参数均不能包含 !var! 变量
一楼代码中的 "!SourceDrive!\Windows\servicing\Version\" 改为 "%SourceDrive%\Windows\servicing\Version\" 即可...

作者: qixiaobin0715    时间: 2024-8-25 10:45

回复 9# aloha20200628
是的,以前使用过:
  1. for /f "tokens=!n!" ...
复制代码
就报错,换成%n%通过。




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