批处理文件,文本文件中的变量/文件名中带有空格

丹摩萨

我根本没有编码方面的知识,因此您必须原谅任何拙劣的术语!

我已经从网上选择了一个批处理文件的一些代码(其中一些来自本网站),并且试图重写其中的一些代码以满足我的需要。

它创建一个新目录,然后在另一个目录及其所有子目录中查找.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)

在大多数情况下,此方法都可以正常工作,但以下情况除外:

  1. 文本文件中的文件名包含空格
  2. 批处理文件所在目录的路径包含空格(或其他特殊字符)

我已经尝试将引号括起来,如下所示:

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使整个赋值表达式都包含在其中""这样可以避免某些特殊字符的麻烦,但是引号不是变量值的一部分;
  • quoted %LIST%,所以我必须在中添加usebackq选项for /f,因为它将变量的值%LIST%视为文字字符串而不是文件;
  • 路径之后/p以及后的图案/mforfiles包含在括号中; 这是非常重要的路径之后/p不会被终止\,因为这将被解释为转义字符forfiles逃避关闭的引号"; 如果您不能确保%FILESPATH%满足该条件,请写/p "%FILESPATH%\." 编辑:最后一个陈述是错误的!
  • @path变量扩展为已经加引号的字符串,因此一切正常。
  • 棘手的部分是%DEST%\@file原始代码中的目标文件,因为它@file会扩展为已加引号的字符串,因此结果将类似于\...\00FoundImages\"FoundImage 1.png"因此,将整个表达式都引用为0x22%DEST%\@file0x221会导致"\...\00FoundImages\"FoundImage 1.png"",因此文件名FoundImage 1.png在命令解释器中显示为未引用;使用0x22%DEST%0x22\@file1会导致"\...\00FoundImages"\"FoundImage 1.png",它不会损害很多命令,但可能会影响某些命令,并且根本不美观;为了克服这个问题,只需%DEST%先将目录更改为cd /d 0x22%DEST%0x221,这样就可以单独声明,然后@file仅在move命令行中使用;
  • 最后,forfiles返回匹配的文件目录,因此为了确保只处理文件,我实现了一个if查询;

1)...该0x22表达式代表命令表达式中"字符,forfiles /C并以十六进制表示形式表示其字符代码;我更喜欢这种指定引号的方式,因为另一个选项\"可能会影响命令行解释器,因为它不支持反斜杠转义,因此它可以识别引号,这可能会无意中改变其行为。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

删除文本文件中带有“。”的行。批处理文件

来自分类Dev

删除文本文件中带有“。”的行。批处理文件

来自分类Dev

批处理:从文本文件中删除所有空格?

来自分类Dev

批处理:从文本文件中删除所有空格?

来自分类Dev

在shell中处理带有空格的文件名

来自分类Dev

在批处理文件中包括文本文件(例如php include但带有批处理)

来自分类Dev

批处理文件,用于将目录中的文件名写入具有特定格式的文本文件

来自分类Dev

将文本文件中的特定行读取到批处理文件中的变量

来自分类Dev

如何使用批处理文件有选择地删除文本文件中的文本?

来自分类Dev

从文本文件读取值以在批处理文件变量中设置

来自分类Dev

文件名中带有空格的grep文件

来自分类Dev

如何将放入文本文件中的变量从批处理调用为批处理文件?

来自分类Dev

处理文件名中带有空格的文件列表

来自分类Dev

在批处理文件的单个变量中添加所有cpp文件名

来自分类Dev

如何将所有带有批处理文件移动的文件登录到文本文件中,并且目标目录包含在日志中?

来自分类Dev

批处理文件,用于将用户输入路径和空格保存到文本文件中。(赢7)

来自分类Dev

循环遍历文本文件并插入带有批处理文件的行

来自分类Dev

在文件名中带有空格的GetFiles

来自分类Dev

将带有空格分隔符的文本文件导入python中的csv

来自分类Dev

将带有空格/ NA的文本文件导入并解析到R中

来自分类Dev

在Unix文本文件中搜索带有空格的模式

来自分类Dev

如何缩短文件路径输出到批处理文件中的文本文件

来自分类Dev

使用文本文件重命名文件夹中的批处理文件

来自分类Dev

读取文本文件中的变量并忽略批处理文件中同一行上的注释

来自分类Dev

批处理文件问题:如何将文本文件从文件(带有感叹号)加载到全局数组中?

来自分类Dev

批处理文件:比较 2 个文本文件并更新文本文件中的特定行

来自分类Dev

创建一个批处理文件,该文件将文本文件和文件夹中的文件名进行比较,如果匹配,它将文件复制到另一个文件夹

来自分类Dev

检查批处理文件中 for 循环内文件名中的空格

来自分类Dev

批处理文件不会将文本文件中的字符串放入变量(包括代码)

Related 相关文章

  1. 1

    删除文本文件中带有“。”的行。批处理文件

  2. 2

    删除文本文件中带有“。”的行。批处理文件

  3. 3

    批处理:从文本文件中删除所有空格?

  4. 4

    批处理:从文本文件中删除所有空格?

  5. 5

    在shell中处理带有空格的文件名

  6. 6

    在批处理文件中包括文本文件(例如php include但带有批处理)

  7. 7

    批处理文件,用于将目录中的文件名写入具有特定格式的文本文件

  8. 8

    将文本文件中的特定行读取到批处理文件中的变量

  9. 9

    如何使用批处理文件有选择地删除文本文件中的文本?

  10. 10

    从文本文件读取值以在批处理文件变量中设置

  11. 11

    文件名中带有空格的grep文件

  12. 12

    如何将放入文本文件中的变量从批处理调用为批处理文件?

  13. 13

    处理文件名中带有空格的文件列表

  14. 14

    在批处理文件的单个变量中添加所有cpp文件名

  15. 15

    如何将所有带有批处理文件移动的文件登录到文本文件中,并且目标目录包含在日志中?

  16. 16

    批处理文件,用于将用户输入路径和空格保存到文本文件中。(赢7)

  17. 17

    循环遍历文本文件并插入带有批处理文件的行

  18. 18

    在文件名中带有空格的GetFiles

  19. 19

    将带有空格分隔符的文本文件导入python中的csv

  20. 20

    将带有空格/ NA的文本文件导入并解析到R中

  21. 21

    在Unix文本文件中搜索带有空格的模式

  22. 22

    如何缩短文件路径输出到批处理文件中的文本文件

  23. 23

    使用文本文件重命名文件夹中的批处理文件

  24. 24

    读取文本文件中的变量并忽略批处理文件中同一行上的注释

  25. 25

    批处理文件问题:如何将文本文件从文件(带有感叹号)加载到全局数组中?

  26. 26

    批处理文件:比较 2 个文本文件并更新文本文件中的特定行

  27. 27

    创建一个批处理文件,该文件将文本文件和文件夹中的文件名进行比较,如果匹配,它将文件复制到另一个文件夹

  28. 28

    检查批处理文件中 for 循环内文件名中的空格

  29. 29

    批处理文件不会将文本文件中的字符串放入变量(包括代码)

热门标签

归档