Board logo

标题: [文件操作] [已解决]批处理中传递变量遇到问题,请指点为盼 [打印本页]

作者: angelbd    时间: 2014-11-19 09:44     标题: [已解决]批处理中传递变量遇到问题,请指点为盼

本帖最后由 angelbd 于 2014-11-20 19:45 编辑

请教一下,我想实现通过批处理自动确认可移动磁盘(U盘)的盘符,然后判断其是否存在jobs文件夹,有就执行一命令,没有的话就创建该文件夹并执行一命令。我遇到的问题是已经取得正确的可移动磁盘的盘符,却不能传递其值给后面的语句,不能实现预期目的。我的批处理内容如下:
@echo off
cls
for %%i in (c d e f g h i j k l m n o p q r s t u v w x y z) do fsutil fsinfo drivetype %%i: | find "可移动">nul
set var=%%i:
if not exist (%var%\jobs) (md %var%\jobs)  
del %var%\jobs\*.* /q>nul
copy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  %var%\jobs /y >nul
del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q >nul  

请高手们热心帮忙指点一下为盼。谢谢了!
作者: DAIC    时间: 2014-11-19 10:45

set var=%%i: 这个用法是错误的,%%i只能在for循环内部使用。

参考一下别人的脚本吧:
http://bbs.bathome.net/thread-3569-1-1.html
作者: amwfjhh    时间: 2014-11-19 11:01

do 后方功能语句应为一语句块,即你须将相关功能用()括起来或者用&连起来,同时,如果你要在语句块内调用实时变量取值,还需开启延时变量,并将变量引用由%%改为!!
作者: amwfjhh    时间: 2014-11-19 11:06

仅对语法部分作更改。
  1. @echo off
  2. cls
  3. setlocal enabledelayedexpansion
  4. for %%i in (c d e f g h i j k l m n o p q r s t u v w x y z) do (
  5. fsutil fsinfo drivetype %%i: | find "可移动">nul && (
  6. set var=%%i:
  7. if not exist (!var!\jobs) (md !var!\jobs)
  8. del !var!\jobs\*.* /q>nul
  9. copy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  !var!\jobs /y >nul
  10. del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q >nul
  11. )
  12. )
  13. pause>nul
复制代码

作者: angelbd    时间: 2014-11-19 12:39

回复 4# amwfjhh


    谢谢指教
作者: angelbd    时间: 2014-11-19 13:15

回复 4# amwfjhh


   试了下还是不行,没有达到预期目的。还请继续帮忙指点
作者: amwfjhh    时间: 2014-11-19 13:28

你预期的目的是什么?把文件夹下的东西全部拷过去?那你不应该用copy,而是xcopy,具体用法看下帮助吧。还有,仅本例而言,其实完全用不着中间set个变量的,直接对%%i进行路径组装就行了。
作者: angelbd    时间: 2014-11-19 15:23

回复 7# amwfjhh


    我想实现,自动判断插入的U盘盘符,并判断其根目录下有无jobs文件夹,有则先清空该文件夹;若没有该文件夹,则创建该文件夹。在此基础上再复制硬盘上指定文件夹中的文件到U盘下的jobs文件夹下。
作者: angelbd    时间: 2014-11-19 15:33

@echo off
cls
for %%i in (c d e f g h i j k l m n o p q r s t u v w x y z) do (
        fsutil fsinfo drivetype %%i: | find "可移动">nul && (
        xcopy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  %%i:\jobs  /s /q  >nul
        del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q >nul
        )
)     这段如果能正确执行也能实现
作者: amwfjhh    时间: 2014-11-19 17:57

用XCOPY /E /Q ... ...试试。
作者: angelbd    时间: 2014-11-19 20:36

回复 10# amwfjhh


    还是不行,不能在U盘建立文件夹
作者: amwfjhh    时间: 2014-11-19 20:40

你没建文件夹啊
作者: angelbd    时间: 2014-11-19 21:56

回复 12# amwfjhh


实现目的:自动判断插入的U盘盘符,并判断其根目录下有无jobs文件夹,有则先清空该文件夹;若没有该文件夹,则创建该文件夹。在此基础上再复制硬盘上指定文件夹中的文件到U盘下的jobs文件夹下。
作者: amwfjhh    时间: 2014-11-19 22:19

我的意思是,你最后的那个代码,把创建文件夹那步删掉了,所以不成功。
作者: apang    时间: 2014-11-19 22:24

回复 9# angelbd


    %%i:\jobs  后面加个斜杠,必需的:%%i:\jobs\
作者: angelbd    时间: 2014-11-20 08:07

回复 15# apang


    具体指哪个,都需要加上?
作者: angelbd    时间: 2014-11-20 08:17

@echo off
cls
for %%i in (c d e f g h i j k l m n o p q r s t u v w x y z) do (
        fsutil fsinfo drivetype %%i: | find "可移动" >nul && (
        if not exist (%%i:\jobs) (md %%i:\jobs)  
        del %%i:\jobs\*.* /q>nul
        copy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  %%i:\jobs  /y >nul
        del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q >nul
        )
   )  请高手帮忙指点或修改这段语句中的错误吧,这是最符合我本意的,谢谢
作者: DAIC    时间: 2014-11-20 08:29

回复 17# angelbd


    请详细说说这段代码的执行结果和你的实际需求有哪些差别?我可以帮你改
作者: angelbd    时间: 2014-11-20 08:52

回复 18# DAIC


   首先谢谢你的帮助。我这个批处理想实现自动查找U盘并确认其盘符,然后判断其根目录下有无jobs这个文件夹,如果有就清空该目录中的所有文件,如果还没有就先创建jobs目录,然后就是将硬盘指定目录下的文件复制到U盘jobs目录中,最后再清空硬盘指定目录下的文件。谢谢你百忙之中热心帮忙。
作者: DAIC    时间: 2014-11-20 09:00

回复 19# angelbd


    请详细说说这段代码的执行结果和你的实际需求有哪些差别?我可以帮你改
作者: angelbd    时间: 2014-11-20 09:33

回复 20# DAIC


   貌似连U盘盘符取值这步都没有成功,无论有无jobs目录,更没有实现目录创建,后续的复制文件也无从谈起了
作者: angelbd    时间: 2014-11-20 09:35

回复 20# DAIC


        if not exist (%%i:\jobs) (md %%i:\jobs)  
        del %%i:\jobs\*.* /q>nul
        copy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  %%i:\jobs  /y >nul
        del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q >nul
这些都没执行,或者没取得正确结果
作者: DAIC    时间: 2014-11-20 13:34

回复 21# angelbd


把 @echo off 删掉
把所有的 >nul 删掉
代码保存为 C:\test.bat
打开一个 CMD 窗口,执行命令:
C:\test.bat

把结果发出来看看
作者: apang    时间: 2014-11-20 17:09

本帖最后由 apang 于 2014-11-20 17:11 编辑

if not exist (%%i:\jobs) (md %%i:\jobs)
这种语法是错误的,应该用双引号而不是用括弧包围

if not exist "%%i:\jobs\" (md %%i:\jobs)
作者: apang    时间: 2014-11-20 18:02

  1. @echo off
  2. set "srcFolder=D:\经纬软件\经纬标签打印系统\PrintLable\jobs"
  3. if not exist "%srcFolder%\" exit/b
  4. (for %%i in (c d e f g h i j k l m n o p q r s t u v w x y z) do (
  5.         fsutil fsinfo drivetype %%i:|findstr /i "Removable 可移动" && (
  6.                 rd /s /q "%%i:\jobs"
  7.                 xcopy "%srcFolder%\*" "%%i:\jobs\" /e /h /c
  8.                 set "flag=1"
  9.         )
  10. ))>nul 2>nul
  11. if defined flag echo rd /s /q "%srcFolder%"
  12. pause
复制代码

作者: angelbd    时间: 2014-11-20 19:25

本帖最后由 angelbd 于 2014-11-20 19:27 编辑

C:\Documents and Settings\Administrator>for %i in (c d e f g h i j k l m n o p q r s t u v w x y z) do (fsutil fsinfo drivetype %i:   | find "可移动"   && (
if not exist "%i:\jobs\" (md %i:\jobs )  
del %i:\jobs\*.* /q  
xcopy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  %i:\jobs /e /q   
del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q  
) )

C:\Documents and Settings\Administrator>(fsutil fsinfo drivetype c:   | find "可移动"   && (
if not exist "c:\jobs\" (md c:\jobs )  
del c:\jobs\*.* /q  
xcopy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  c:\jobs /e /q   
del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q  
) )

C:\Documents and Settings\Administrator>(fsutil fsinfo drivetype d:   | find "可移动"   && (
if not exist "d:\jobs\" (md d:\jobs )  
del d:\jobs\*.* /q  
xcopy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  d:\jobs /e /q   
del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q  
) )

C:\Documents and Settings\Administrator>(fsutil fsinfo drivetype e:   | find "可移动"   && (
if not exist "e:\jobs\" (md e:\jobs )  
del e:\jobs\*.* /q  
xcopy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  e:\jobs /e /q   
del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q  
) )

C:\Documents and Settings\Administrator>(fsutil fsinfo drivetype f:   | find "可移动"   && (
if not exist "f:\jobs\" (md f:\jobs )  
del f:\jobs\*.* /q  
xcopy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  f:\jobs /e /q   
del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q  
) )

C:\Documents and Settings\Administrator>(fsutil fsinfo drivetype g:   | find "可移动"   && (
if not exist "g:\jobs\" (md g:\jobs )  
del g:\jobs\*.* /q  
xcopy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  g:\jobs /e /q   
del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q  
) )

C:\Documents and Settings\Administrator>(fsutil fsinfo drivetype h:   | find "可移动"   && (
if not exist "h:\jobs\" (md h:\jobs )  
del h:\jobs\*.* /q  
xcopy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  h:\jobs /e /q   
del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q  
) )

C:\Documents and Settings\Administrator>(fsutil fsinfo drivetype i:   | find "可移动"   && (
if not exist "i:\jobs\" (md i:\jobs )  
del i:\jobs\*.* /q  
xcopy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  i:\jobs /e /q   
del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q  
) )

C:\Documents and Settings\Administrator>(fsutil fsinfo drivetype j:   | find "可移动"   && (
if not exist "j:\jobs\" (md j:\jobs )  
del j:\jobs\*.* /q  
xcopy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  j:\jobs /e /q   
del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q  
) )

C:\Documents and Settings\Administrator>(fsutil fsinfo drivetype k:   | find "可移动"   && (
if not exist "k:\jobs\" (md k:\jobs )  
del k:\jobs\*.* /q  
xcopy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  k:\jobs /e /q   
del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q  
) )

C:\Documents and Settings\Administrator>(fsutil fsinfo drivetype l:   | find "可移动"   && (
if not exist "l:\jobs\" (md l:\jobs )  
del l:\jobs\*.* /q  
xcopy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  l:\jobs /e /q   
del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q  
) )

C:\Documents and Settings\Administrator>(fsutil fsinfo drivetype m:   | find "可移动"   && (
if not exist "m:\jobs\" (md m:\jobs )  
del m:\jobs\*.* /q  
xcopy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  m:\jobs /e /q   
del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q  
) )

C:\Documents and Settings\Administrator>(fsutil fsinfo drivetype n:   | find "可移动"   && (
if not exist "n:\jobs\" (md n:\jobs )  
del n:\jobs\*.* /q  
xcopy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  n:\jobs /e /q   
del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q  
) )

C:\Documents and Settings\Administrator>(fsutil fsinfo drivetype o:   | find "可移动"   && (
if not exist "o:\jobs\" (md o:\jobs )  
del o:\jobs\*.* /q  
xcopy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  o:\jobs /e /q   
del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q  
) )

C:\Documents and Settings\Administrator>(fsutil fsinfo drivetype p:   | find "可移动"   && (
if not exist "p:\jobs\" (md p:\jobs )  
del p:\jobs\*.* /q  
xcopy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  p:\jobs /e /q   
del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q  
) )

C:\Documents and Settings\Administrator>(fsutil fsinfo drivetype q:   | find "可移动"   && (
if not exist "q:\jobs\" (md q:\jobs )  
del q:\jobs\*.* /q  
xcopy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  q:\jobs /e /q   
del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q  
) )

C:\Documents and Settings\Administrator>(fsutil fsinfo drivetype r:   | find "可移动"   && (
if not exist "r:\jobs\" (md r:\jobs )  
del r:\jobs\*.* /q  
xcopy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  r:\jobs /e /q   
del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q  
) )

C:\Documents and Settings\Administrator>(fsutil fsinfo drivetype s:   | find "可移动"   && (
if not exist "s:\jobs\" (md s:\jobs )  
del s:\jobs\*.* /q  
xcopy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  s:\jobs /e /q   
del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q  
) )

C:\Documents and Settings\Administrator>(fsutil fsinfo drivetype t:   | find "可移动"   && (
if not exist "t:\jobs\" (md t:\jobs )  
del t:\jobs\*.* /q  
xcopy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  t:\jobs /e /q   
del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q  
) )

C:\Documents and Settings\Administrator>(fsutil fsinfo drivetype u:   | find "可移动"   && (
if not exist "u:\jobs\" (md u:\jobs )  
del u:\jobs\*.* /q  
xcopy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  u:\jobs /e /q   
del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q  
) )

C:\Documents and Settings\Administrator>(fsutil fsinfo drivetype v:   | find "可移动"   && (
if not exist "v:\jobs\" (md v:\jobs )  
del v:\jobs\*.* /q  
xcopy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  v:\jobs /e /q   
del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q  
) )

C:\Documents and Settings\Administrator>(fsutil fsinfo drivetype w:   | find "可移动"   && (
if not exist "w:\jobs\" (md w:\jobs )  
del w:\jobs\*.* /q  
xcopy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  w:\jobs /e /q   
del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q  
) )

C:\Documents and Settings\Administrator>(fsutil fsinfo drivetype x:   | find "可移动"   && (
if not exist "x:\jobs\" (md x:\jobs )  
del x:\jobs\*.* /q  
xcopy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  x:\jobs /e /q   
del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q  
) )

C:\Documents and Settings\Administrator>(fsutil fsinfo drivetype y:   | find "可移动"   && (
if not exist "y:\jobs\" (md y:\jobs )  
del y:\jobs\*.* /q  
xcopy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  y:\jobs /e /q   
del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q  
) )

C:\Documents and Settings\Administrator>(fsutil fsinfo drivetype z:   | find "可移动"   && (
if not exist "z:\jobs\" (md z:\jobs )  
del z:\jobs\*.* /q  
xcopy D:\经纬软件\经纬标签打印系统\PrintLable\jobs  z:\jobs /e /q   
del D:\经纬软件\经纬标签打印系统\PrintLable\jobs\*.* /q  
) )
=======================================
结果是所有磁盘盘符都执行了一遍,而不是只是对可移动U盘操作。这与我的本意是不相符的
作者: angelbd    时间: 2014-11-20 19:41

回复 25# apang


    谢谢,你的方案已经验证正确,问题完美解决。谢谢众位热心人士。




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