出于某种原因,如果我从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
答案 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
开始,并在目标文件夹中添加匹配的扩展名。