【问题标题】:copy directory using variable name in batch script在批处理脚本中使用变量名复制目录
【发布时间】:2016-01-24 02:59:44
【问题描述】:

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

问题是我想将新创建的目录(连同它们包含的文件)复制到我的 MP3 播放器。 (D:\音乐),

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

换句话说,我最终得到: 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

【问题讨论】:

  • 如果您添加 bash 代码以供参考,可能会有所帮助。例如,我想知道为什么脚本以交互方式询问文件夹名称,因为它似乎不太方便。也不清楚你为什么在c:\..... 上创建%folder%。看看cd /d 选项,可能会有用。
  • 看看窗口的xcopy 和/或robocopy - 它们更高级。此外,您可能需要安装 Cygwin,以便可以在 Windows 上使用 bash 脚本。
  • @wOxxOm 基本上,交互式询问目录名称的原因是我不确定如何使用过去的日期作为目录名称来创建目录。当我最初开始这个时,我只是没有想到在 D 上创建目录,因为我要移动的文件已下载到 C。
  • @wOxxOm 我想我的问题归结为:在脚本中,当您使用变量引用目录名称时,将该目录及其内容复制到另一个位置的语法是什么?
  • 然后将新信息放入问题中。可以编辑吗?

标签: batch-file directory copy


【解决方案1】:
  1. 要创建一个以今天的日期为名称的目录,请使用locale-independent method

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

    日月年
    25  10      2015

    要将其放入变量中,请使用跳过标题行的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:Coast to Coast AM 播客,POSTFIX:
    SRC:黑暗电台,后缀:-DR
    SRC:这里没有冒号,所以后缀也是空的,后缀:

    注意:默认情况下,要解析的文本必须双引号 for /f %%a in ("some text") do,但在我们的例子中,%%a总是包含双引号字符串,因此我们可以使用 in (%%a)

  3. 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 处理子目录,/y 静默覆盖现有文件。

【讨论】:

  • 感谢您的帮助。我很感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-30
  • 1970-01-01
  • 2014-11-28
  • 2011-02-10
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多