使用批处理脚本中的变量名复制目录

时间:2015-10-24 18:04:32

标签: batch-file directory copy

我有一个问题,希望你愿意回答。我在编写BASH脚本方面有相当多的经验,但对Windows脚本编程几乎一无所知。所以我的问题可能非常基础。我有一个脚本,要求用户输入并使用该输入创建两个目录。然后脚本将.mp3文件移动到新创建的目录中。到目前为止一切都很好。

问题是我想将新创建的目录(及其包含的文件)复制到我的MP3播放器。 (D:\ MUSIC),

然而,当我运行脚本时会发生什么,mp3文件被单独复制到目标目录 - 也就是说它们最终不是复制到它们的目录的副本,而只是在D:\中MUSIC目录。

换句话说,我最终得到: D:\ MUSIC \ file.mp3而不是D:\ MUSIC \ new_directory \ file.mp3

以下是我的剧本:如果你能给我一些关于我做错的线索,我将不胜感激。

谢谢,

GG

    @echo off
set /p FOLDER= Name the folder
cd C:\Users\John\Music\iTunes\iTunes Media\Podcasts\"Coast to Coast AM Podcast" 
MD %FOLDER%
Move *.mp3 %FOLDER% 
Copy %FOLDER% D:\MUSIC
CD C:\Users\John\Music\iTunes\iTunes Media\Podcasts\"Darkness Radio"
MD %FOLDER%-DR
Move *.mp3 %UserInputName%-DR
Copy "%FOLDER%-DR" D:\MUSIC

1 个答案:

答案 0 :(得分:0)

  1. 要使用今天的日期作为名称创建目录,请使用locale-independent method

    wmic path Win32_LocalTime get Day,Month,Year /format:table
    
      

    日月年   2015年10月25日

    要将其放入变量使用跳过标题行的for /f parse-loop,将接下来的3个标记放入%% a,%% b,%% c,用0填充MONTH和DAY,提取最后两位数字(01—>01011—>11)。

    for /f "tokens=1-3 skip=1" %%a in ('
        wmic path Win32_LocalTime get Day^,Month^,Year /format:table
    ') do if not "%%c"=="" set "YEAR=%%c" & set "MONTH=0%%b" & set "DAY=0%%a"
    set TODAY=%YEAR%.%MONTH:~-2%.%DAY:~-2%
    
      

    2015年10月25日

    注意:,中的=for /f需要使用^进行转义,&|也是如此,><(我们这里没有使用它们。)

  2. 现在让我们在普通for循环中声明要处理的文件夹列表,每个项目将是:
    没有路径的源文件夹名称 目标文件夹后缀,可以在:分成两个新的循环变量:

    for %%a in (
        "Coast to Coast AM Podcast:"
        "Darkness Radio:-DR"
        "No colon here so the postfix will be empty too"
    ) do for /f "delims=: tokens=1,2" %%b in ("%%~a") do echo SRC: %%b, POSTFIX: %%c
    
      

    SRC:从海岸到海岸AM播客,POSTFIX:
      SRC:Darkness Radio,POSTFIX:-DR
      SRC:这里没有冒号所以后缀也是空的,POSTFIX:

    注意:默认情况下,要解析的文本必须加倍引用for /f %%a in ("some text") do,但在我们的情况下,%%a 始终包含双引号字符串,因此我们可以使用{{1} }。

  3. in (%%a)会根据需要创建目标目录(最后注明xcopy /s "SOURCE" "TARGET\")。

  4. 最终代码:

    \

    注意:@echo off set "COPY_FROM=%USERPROFILE%\Music\iTunes\iTunes Media\Podcasts" set "COPY_TO=D:\MUSIC" rem Use a locale-independent method of getting the date for /f "tokens=1-3 skip=1" %%a in (' wmic path Win32_LocalTime get Day^,Month^,Year /format:table ') do if not "%%c"=="" set "YEAR=%%c" & set "MONTH=0%%b" & set "DAY=0%%a" set TODAY=%YEAR%.%MONTH:~-2%.%DAY:~-2% for %%a in ( "Coast to Coast AM Podcast:" "Darkness Radio:-DR" ) do for /f "delims=: tokens=1,2" %%b in (%%a) do ( xcopy /s /d /y "%COPY_FROM%\%%b\*.mp3" "%COPY_TO%\%TODAY%%%c\" ) pause 仅复制较新的文件,xcopy /d进程子目录,/s以静默方式覆盖现有文件。