首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >批处理文件移动不适用于某些特殊字符

批处理文件移动不适用于某些特殊字符
EN

Stack Overflow用户
提问于 2019-10-29 09:41:43
回答 2查看 381关注 0票数 0

我有一个视频托管网站,视频存储在年度-月-日子文件夹。我有第二个文件夹,它拥有第一个文件夹中所有视频的所有缩略图。

下面的脚本递归地获取第一个文件夹中视频文件的名称和目录,并使用这些变量将第二个文件夹中的缩略图移动到第三个文件夹。

代码语言:javascript
复制
@echo on

Set first_folder="G:\Site Backups\BM Backup\public_html\Videos\hold"
Set second_folder="C:\Users\Work\Desktop\Test Env\thumbs unorganized"
Set third_folder="C:\Users\Work\Desktop\Test Env\thumbs organized"

for /f "tokens=*" %%A in ('dir /b /a:d %first_folder%') do (

for /f "tokens=*" %%B in ('dir /b /a:d %first_folder%\%%A') do (

    for /f "tokens=*" %%C in ('dir /b /a:d %first_folder%\%%A\%%B') do (

        setlocal EnableDelayedExpansion

        for /f "delims= eol=" %%D in ('dir %first_folder%\%%A\%%B\%%C /b') do (

            for /f "delims=\ tokens=7-9" %%f in ("%first_folder%\%%A\%%B\%%C\%%D") do (

                    IF EXIST %third_folder%\%%f-%%g-%%h (

                        move %second_folder%\"%%~nD.jpg" %third_folder%\%%f-%%g-%%h\"%%~nD.jpg"

                    )
            )
        )
    )  
) 
)

@echo on

echo "image files have been translated successfully!"
pause

唯一的问题是,如果视频名称中有感叹号和括号之类的特殊字符,有时是出于某种奇怪的原因,脚本中写道:

系统找不到指定的路径

例子:一个名为,国王和青蛙的视频的缩略图!!.mp4会给出错误,但是的缩略图,国王和Frog.mp4会移动!

知道他们为什么不动吗?

另一件事是,当脚本到达一个名为14和15的子文件夹时,它将不会在目录中找到它。

经修订的工作守则:

代码语言:javascript
复制
@echo on

Set "first_folder=G:\Site Backups\BM Backup\public_html\Videos\hold"
Set "second_folder=C:\Users\Work\Desktop\Test Env\thumbs unorganized"
Set "third_folder=C:\Users\Work\Desktop\Test Env\thumbs organized"

for /f "tokens=*" %%A in ('dir /b /a:d "%first_folder%"') do (
 for /f "tokens=*" %%B in ('dir /b /a:d "%first_folder%\%%A"') do (
  for /f "tokens=*" %%C in ('dir /b /a:d "%first_folder%\%%A\%%B"') do (
    for /f "delims= eol=" %%D in ('dir "%first_folder%\%%A\%%B\%%C" /b') do (
      for /f "delims=\ tokens=7-9" %%f in ("%first_folder%\%%A\%%B\%%C\%%D") do (
                IF EXIST "%third_folder%\%%f-%%g-%%h" (
                    move "%second_folder%\%%~nD.jpg" "%third_folder%\%%f-%%g-%%h\%%~nD.jpg"
          )
       )
    )
 )  
) 
)

@echo on

echo "image files have been translated successfully!"
pause
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-29 10:18:57

在设置变量路径时,需要将整个变量和值用双引号括起来:

代码语言:javascript
复制
Set "first_folder=G:\Site Backups\BM Backup\public_html\Videos\hold"
Set "second_folder=C:\Users\Work\Desktop\Test Env\thumbs unorganized"
Set "third_folder=C:\Users\Work\Desktop\Test Env\thumbs organized"

然后将它们用作:

代码语言:javascript
复制
move "%second_folder%\%%~nD.jpg" "%third_folder%\%%f-%%g-%%h\%%~nD.jpg"

setlocal enabledelayedexpansion应该在脚本中删除,因为您从未使用过它,但是它将利用!,这就是您的问题所在。

要理解引用问题,请查看您的set变量和for循环,如本例所示:

在path中有双引号,双引号现在是值的一部分:

代码语言:javascript
复制
set first_folder="G:\Site Backups\BM Backup\public_html\Videos\hold"

然后在循环中:

代码语言:javascript
复制
for...("%first_folder%\%%A\%%B\%%C\%%D")

这意味着:

代码语言:javascript
复制
"%first_folder%"\somedir\14th & 15th

因此,您当前的代码(不是由我增强的)只是修复问题:

代码语言:javascript
复制
@echo on

Set "first_folder=G:\Site Backups\BM Backup\public_html\Videos\hold"
Set "second_folder=C:\Users\Work\Desktop\Test Env\thumbs unorganized"
Set "third_folder="C:\Users\Work\Desktop\Test Env\thumbs organized"

for /f "tokens=*" %%A in ('dir /b /a:d "%first_folder%"') do (
 for /f "tokens=*" %%B in ('dir /b /a:d "%first_folder%\%%A"') do (
  for /f "tokens=*" %%C in ('dir /b /a:d "%first_folder%\%%A\%%B"') do (
    for /f "delims= eol=" %%D in ('dir /b "%first_folder%\%%A\%%B\%%C"') do (
      for /f "delims=\ tokens=7-9" %%f in ("%first_folder%\%%A\%%B\%%C\%%D") do (
                    IF EXIST "%third_folder%\%%f-%%g-%%h" (
                        move "%second_folder%\%%~nD.jpg" "%third_folder%\%%f-%%g-%%h\%%~nD.jpg"
              )
           )
        )
     )  
   ) 
)

@echo on

echo "image files have been translated successfully!"
pause
票数 0
EN

Stack Overflow用户

发布于 2019-10-29 10:10:12

好的,我已经重写了这个,以消除一些冗余,并使用一些更好的实践。

这应该能满足你的需要,对不起,我在上午准备的时候花了一些时间。

如果不存在要移动到的文件夹,我更改脚本以创建预期文件夹,并且我有脚本来检查源jpeg是否存在,如果它不存在,它将通知您,而不是为移动抛出错误。

我也有移动文件过传统的现有文件,而不是提示。

代码语言:javascript
复制
@(setlocal
  echo on
)

Set "first_folder=G:\Site Backups\BM Backup\public_html\Videos\hold"
Set "second_folder=C:\Users\Work\Desktop\Test Env\thumbs unorganized"
Set "third_folder=C:\Users\Work\Desktop\Test Env\thumbs organized"

for /f "tokens=*" %%A in ('
  dir /b /ad "%first_folder%"') do (
  for /f "tokens=*" %%B in ('
    dir /b /ad "%first_folder%\%%A"') do (
    for /f "tokens=*" %%C in ('
      dir /b /ad "%first_folder%\%%A\%%B"') do (
      for %%_ IN (
        "%first_folder%\%%A\%%B\%%C\*") do (
        IF NOT EXIST "%third_folder%\%%A-%%B-%%C" (
          MD "%third_folder%\%%A-%%B-%%C" )
        IF EXIST "%second_folder%\%%~n_.jpg" (
          MOVE /Y "%second_folder%\%%~n_.jpg" "%third_folder%\%%A-%%B-%%C\%%~n_.jpg"
        ) ELSE (
          ECHO. The File "%second_folder%\%%~n_.jpg" DOES NOT EXIST!
        )
      )
    )
  )
)

@echo off

echo "image files have been translated successfully!"
pause

在循环中使用Setlocal会导致脚本中不必要的内存膨胀,然后就会耗尽可复制的内存空间,这可能会引发错误,因为您没有;在同一个块中使用配对的endlocal;它也完全没有必要,因为它在代码中没有用途。

Enabledelayedexpansion会导致错误。感叹号etc.and在任何情况下都不需要用于代码。

此外,您的脚本不必要地将子文件夹名称的值重新转换为可以丢弃的新循环变量。

第四,引用SETMOVE命令会导致问题。

我将在几分钟内重写这个部分,以消除一些冗余,并修复这些部分以更好地实践。

但是,要解释所需的内容,您应该将整个目录树和文件名包装为引号,而不仅仅是move命令的文件名,而且您早期set的目录名都在它们的变量中包含引号,这通常也不是一件好事。

以这种方式设置变量可能会导致空格尾随它们,这是使用set "variable=value here without any unnecessary quotes "necessary quotes are okay though, so long as they are in pairs " and this is still in the variable"的良好实践,因为尾随空格是不可能的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58604784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档