批处理文件不移动文件
Batch file not moving files
出于某种原因,如果我 运行 来自 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
抱歉,对我来说你的代码一团糟。我会尝试清理它并解决问题。
@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:我想为您提供一些有关批量清洁代码的技巧。如果您不感兴趣,请跳过 post 的其余部分。
不要在变量名中使用 $ 等特殊字符。这在批量编码中并不常见,在非常意外的情况下可能会导致麻烦。
有些人喜欢用大写字母键入命令(PING、ECHO、CLS),而其他人则不喜欢(dir、for、if)。为了保持你的代码干净,你应该尝试跳到一个约定。像这样的行会让你的代码难读:
ECHO Treating _^> %%a
if "!$Fichier:~0,3!"==...
为什么你的代码失败了?您正在使用 for /f
命令来处理 dir /b
命令的输出。此输出不包括文件夹信息,除非使用 /s
开关进行递归搜索。因此,由于正在处理的 字符串 (不是对 for
找到的文件的引用)不包括文件夹,因此以下命令的 none
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%5*%%~b" "%output305%"
>nul ping localhost -n 6
)
无限循环 (for /l %%a in (0)
),它将遍历指定的扩展名列表并将输入文件夹中的任何文件移动到目标文件夹中,从 305
开始并将匹配的扩展名。
出于某种原因,如果我 运行 来自 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
抱歉,对我来说你的代码一团糟。我会尝试清理它并解决问题。
@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:我想为您提供一些有关批量清洁代码的技巧。如果您不感兴趣,请跳过 post 的其余部分。
不要在变量名中使用 $ 等特殊字符。这在批量编码中并不常见,在非常意外的情况下可能会导致麻烦。
有些人喜欢用大写字母键入命令(PING、ECHO、CLS),而其他人则不喜欢(dir、for、if)。为了保持你的代码干净,你应该尝试跳到一个约定。像这样的行会让你的代码难读:
ECHO Treating _^> %%a
if "!$Fichier:~0,3!"==...
为什么你的代码失败了?您正在使用 for /f
命令来处理 dir /b
命令的输出。此输出不包括文件夹信息,除非使用 /s
开关进行递归搜索。因此,由于正在处理的 字符串 (不是对 for
找到的文件的引用)不包括文件夹,因此以下命令的 none
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%5*%%~b" "%output305%"
>nul ping localhost -n 6
)
无限循环 (for /l %%a in (0)
),它将遍历指定的扩展名列表并将输入文件夹中的任何文件移动到目标文件夹中,从 305
开始并将匹配的扩展名。