我根本没有编码方面的知识,因此您必须原谅任何拙劣的术语!
我已经从网上选择了一个批处理文件的一些代码(其中一些来自本网站),并且试图重写其中的一些代码以满足我的需要。
它创建一个新目录,然后在另一个目录及其所有子目录中查找.txt列表中的文件名,然后将这些文件复制到开头创建的目录中。从列表中找不到的所有文件都将写入另一个文本文件中,以跟踪丢失的所有内容。
代码是:
md 00FoundImages
set LIST=%cd%\imagelist.txt
set FILESPATH=%cd%\testimages
set DEST=%cd%\00FoundImages
for /f "delims=" %%x in (%LIST%) do (forfiles /p %FILESPATH% /s /m %%x* /c "cmd /c move /y @path %DEST%\@file" 2>>errors.txt)
在大多数情况下,此方法都可以正常工作,但以下情况除外:
我已经尝试将引号括起来,如下所示:
set FILELIST="%cd%\imagelist.txt"
set FILESPATH="%cd%\testimages"
set DESTPATH="%cd%\00FoundImages"
forfiles
在目录名称中发现空格后,该命令将失败。
我试过将变量用在引号中时将其括起来,如下所示:
for /f "delims=" %%x in ("%LIST%") do (forfiles /p "%FILESPATH%" /s /m %%x* /c "cmd /c move /y @path "%DEST%\@file"" 2>>errors.txt)
当我从名为“测试-复制”的目录运行批处理文件时,将错误写入到errors.txt文件中
ERROR: Invalid argument/option - '-'.
Type "FORFILES /?" for usage.
这是正在发生的事情的印记:
E:\ImageAutomationStuff\testing - Copy>md 00FoundImages
A subdirectory or file 00FoundImages already exists.
E:\ImageAutomationStuff\testing - Copy>set LIST=E:\ImageAutomationStuff\testing - Copy\imagelist.txt
E:\ImageAutomationStuff\testing - Copy>set FILESPATH=E:\ImageAutomationStuff\testing - Copy\testimages
E:\ImageAutomationStuff\testing - Copy>set DEST=E:\ImageAutomationStuff\testing - Copy\00FoundImages
E:\ImageAutomationStuff\testing - Copy>pause
Press any key to continue . . .
E:\ImageAutomationStuff\testing - Copy>for /F "delims=" %x in ("E:\ImageAutomationStuff\testing - Copy\imagelist.txt") do (forfiles /p "E:\ImageAutomationStuff\testing - Copy\testimages" /s /m %x* /c "cmd /c move /y @path "E:\ImageAutomationStuff\testing - Copy\00FoundImages\@file"" 2>>errors.txt )
E:\ImageAutomationStuff\testing - Copy>(forfiles /p "E:\ImageAutomationStuff\testing - Copy\testimages" /s /m E:\ImageAutomationStuff\testing - Copy\imagelist.txt* /c "cmd /c move /y @path "E:\ImageAutomationStuff\testing - Copy\00FoundImages\@file"" 2>>errors.txt )
E:\ImageAutomationStuff\testing - Copy>pause
Press any key to continue . . .
从我已经完成的研究中,我可以看到很多关于这种性质的问题-道歉,这增加了我的歉意,但由于我的知识有限,我恐怕无法单靠自己解决这个问题!
为避免路径和文件名中的空格出现问题,请使用引号。但是在使用时,您需要forfiles
格外小心,因为所有与路径和文件名相关的@
变量都会扩展为已经包含在其中的值""
,因此很容易碰巧将值双引号引起来。
我会尝试一下:
md "%cd%\00FoundImages"
set "LIST=%cd%\imagelist.txt"
set "FILESPATH=%cd%\testimages"
set "DEST=%cd%\00FoundImages"
for /f "usebackq delims=" %%x in ("%LIST%") do (
forfiles /p "%FILESPATH%" /s /m "%%x*" /c "cmd /c if @isdir==FALSE cd /d 0x22%DEST%0x22 & move /y @path @file" 2>>errors.txt
)
我做了什么:
set
使整个赋值表达式都包含在其中""
;这样可以避免某些特殊字符的麻烦,但是引号不是变量值的一部分;%LIST%
,所以我必须在中添加usebackq
选项for /f
,因为它将变量的值%LIST%
视为文字字符串而不是文件;/p
以及后的图案/m
的forfiles
包含在括号中; 这是非常重要的路径之后/p
是不会被终止\
,因为这将被解释为转义字符forfiles
逃避关闭的引号"
; %FILESPATH%
满足该条件,请写/p "%FILESPATH%\."
;@path
变量扩展为已经加引号的字符串,因此一切正常。%DEST%\@file
原始代码中的目标文件,因为它@file
会扩展为已加引号的字符串,因此结果将类似于\...\00FoundImages\"FoundImage 1.png"
。因此,将整个表达式都引用为0x22%DEST%\@file0x22
1会导致"\...\00FoundImages\"FoundImage 1.png""
,因此文件名FoundImage 1.png
在命令解释器中显示为未引用;使用0x22%DEST%0x22\@file
1会导致"\...\00FoundImages"\"FoundImage 1.png"
,它不会损害很多命令,但可能会影响某些命令,并且根本不美观;为了克服这个问题,只需%DEST%
先将目录更改为cd /d 0x22%DEST%0x22
1,这样就可以单独声明,然后@file
仅在move
命令行中使用;forfiles
返回匹配的文件和目录,因此为了确保只处理文件,我实现了一个if
查询;1)...该0x22
表达式代表命令表达式中的"
字符,forfiles /C
并以十六进制表示形式表示其字符代码;我更喜欢这种指定引号的方式,因为另一个选项\"
可能会影响命令行解释器,因为它不支持反斜杠转义,因此它可以识别引号,这可能会无意中改变其行为。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句