批处理文件不移动文件

时间:2015-05-19 09:53:53

标签: batch-file cmd

出于某种原因,如果我从sDir以外的其他位置运行批处理文件,它将不会移动文件

@ECHO OFF &CLS
::// The Input Folder
SET $sDir="C:\Temp"

:: The Output Folders
SET $Out305="C:\Documents\completed"

::// Set Files extensions
SET "$Format=*.pdf,*.doc,*.jpg"

SETLOCAL enabledelayedexpansion

:Loop
cls&echo Waiting for file !!!
for /f %%a in ('dir /b/a-d %$sDir%\%$Format% 2^>nul') do (
 SET "$Fichier=%%a"
 ECHO Treating _^> %%a
 if "!$Fichier:~0,3!"=="305" move "%%~nxa" %$Out305%
)

::// Waiting ~5 seconds
ping localhost -n 6 >nul

::// Return to the loop
goto:Loop

2 个答案:

答案 0 :(得分:1)

抱歉,但对我来说,你的代码很乱。我会尝试清理它并解决问题。

@ECHO OFF
CLS

:: The Input Folder
SET sDir="C:\Temp"

:: The Output Folders
SET Out305="C:\Documents\completed"

:: Set Files extensions
SET "Format=*.pdf,*.doc,*.jpg"

SETLOCAL EnableDelayedExpansion

:Loop
CLS
ECHO Waiting for file!!!
FOR /F %%a IN ('DIR /b/a-d %sDir%\%Format% 2^>nul') DO (
    SET "Fichier=%%a"
    ECHO Treating _^> %%a
    IF "!Fichier:~0,3!"=="305" MOVE "%%a" %Out305%
)

:: Waiting ~5 seconds
PING localhost -n 6 >nul

:: Return to the loop
GOTO Loop

我想问题就在于这一行:

IF "!Fichier:~0,3!"=="305" move "%%~nxa" %Out305%

您的来源为%%~nxa,表示%%a的名称和扩展名。但是这样你只需忽略文件的路径,脚本只会在它自己的目录中查找它。修复程序只是用%%~nxa%%a替换%%~dpnxa。请告诉我它是否有帮助。

PS:我想为您提供批量清理代码的一些提示。如果您不感兴趣,请跳过帖子的其余部分。

不要在变量名中使用$等特殊字符。这在批量编码中并不常见,并且可能在非常意外的情况下引起麻烦。

有些人喜欢用大写字母(PING,ECHO,CLS)键入命令,有些人不喜欢(dir,for,if)。为了保持代码清洁,您应该尝试熟悉一个约定。像theese一样让你的代码难看:

  

ECHO治疗_ ^> %%一个

     

if"!$ Fichier:~0,3!" == ...

答案 1 :(得分:1)

为什么你的代码失败了?您正在使用for /f命令来处理dir /b命令的输出。除非使用/s开关进行递归搜索,否则此输出不包括文件夹信息。因此,由于正在处理的字符串(不是对for找到的文件的引用)不包含文件夹,因此没有以下命令

MOVE "%%~nxa" .... ( only name and extension, no path )
MOVE "%%a" ....    ( only name and extension, the string does not include path )
MOVE "%%~fa" ....  ( path generated using the active directory, not file folder )

会找到该文件,因为它不在当前文件夹中(前两个)或路径错误(第三个)。

你需要像

这样的东西
MOVE "%$sDir%\%%a" ....

但由于您的变量还包含引号,因此您必须将set命令更改为

SET "$sDir=c:\temp"

也就是说,如果稍后我们需要连接值,则引号不应包含在值中。

无论如何,作为代码用来将305开头的文件移动到目标文件夹并重复该过程的唯一事情,这可以简化为

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "inputFolder=c:\temp"
    set "output305=c:\documents\completed"
    set "extensions=.pdf .doc .jpg"

    for /l %%a in (0) do (
        for %%b in (%extensions%) do 2>nul move /y "%inputFolder%\305*%%~b" "%output305%"
        >nul ping localhost -n 6 
    )

一个无限循环(for /l %%a in (0)),它将迭代指定的扩展列表并移动输入文件夹中的任何文件,从305开始,并在目标文件夹中添加匹配的扩展名。