Batch file 批处理,将文件副本创建到具有变量名的单个目录中

Batch file 批处理,将文件副本创建到具有变量名的单个目录中,batch-file,Batch File,我正在尝试创建一个批处理文件,该文件将: 询问目录(其中包含许多文件) 请求第二个目录(这是批处理将为每个文件创建目录的位置,然后将每个文件复制到其自己的目录) 要从所创建目录的右侧删除的字符数。(例如,两个文档“NewDoc\u Ver1”和“NewDoc\u Ver2”都将复制到同一目录“NewDoc”) 下面是一些可能有帮助的类似问题 @echo off setlocal enabledelayedexpansion cls :input set /p "input=1. Enter So

我正在尝试创建一个批处理文件,该文件将:

  • 询问目录(其中包含许多文件)

  • 请求第二个目录(这是批处理将为每个文件创建目录的位置,然后将每个文件复制到其自己的目录)

  • 要从所创建目录的右侧删除的字符数。(例如,两个文档“NewDoc\u Ver1”和“NewDoc\u Ver2”都将复制到同一目录“NewDoc”)

  • 下面是一些可能有帮助的类似问题

    @echo off
    setlocal enabledelayedexpansion
    cls
    :input
    set /p "input=1. Enter Source directory: "
    if not exist "%input%" echo Invalid source: "%input%" enter valid path && goto :input 
    :output
    set /p "output=2. Select Destination Directory: "
    if not exist "%output%" echo Invalid Dest: "%output%" enter valid path && goto :output
    
    for %%i in (%input%\*) do (
     set "file=%%~nxi"
     for /f "delims=_" %%a in ("!file!") do (
     set "folder=%%a"
     if not exist "!output!\!folder!" mkdir "!output!\!folder!"
      copy /Y "!input!\!file!" "!output!\!folder!" >nul
      echo Copied "!input!\!file!" to "!output!\!folder!\!file!"
      )
    )
    

    我目前一直在尝试让“字符串左”与动态数字一起工作。(我还没有研究如何输入用户输入) 任何帮助都会很好

    @echo off
    setlocal enabledelayedexpansion
    set folderpath=C:\Users\james.shaw\Desktop\R2
    for %%f in (%folderpath%\*.*) do (
      set "foldername=%%~nf"
      set f1=!foldername!
      call :strlen folderlength foldername
    REM set JS1=%%foldername:~0,!folderlength!%%
    set JS1=!f1!:~0,!folderlength!
      md !JS1!
    REM md "!foldername:~0,!folderlength!!" >nul 2>&1
      move "%%f" "!foldername:~0,!folderlength!!"
    pause
    )
    goto :eof
    
    :strlen <resultVar> <stringVar>
    (   
        setlocal EnableDelayedExpansion
        set "s=!%~2!#"
        set "len=0"
        for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
            if "!s:~%%P,1!" NEQ "" ( 
                set /a "len+=%%P"
                set "s=!s:~%%P!"
            )
        )
    )
    ( 
        endlocal
        set "%~1=%len%"
        exit /b
    )
    

    从你们的例子来看:

    NewDoc_Ver1
    NewDoc_Ver2
    
    似乎您可能有一个公共分隔符,即
    \uu

    如果事实上是这样的,并且您只想将
    \uu
    之前的第一个单词作为文件夹名,那么这可能会有所帮助

    @echo off
    setlocal enabledelayedexpansion
    cls
    :input
    set /p "input=1. Enter Source directory: "
    if not exist "%input%" echo Invalid source: "%input%" enter valid path && goto :input 
    :output
    set /p "output=2. Select Destination Directory: "
    if not exist "%output%" echo Invalid Dest: "%output%" enter valid path && goto :output
    
    for %%i in (%input%\*) do (
     set "file=%%~nxi"
     for /f "delims=_" %%a in ("!file!") do (
     set "folder=%%a"
     if not exist "!output!\!folder!" mkdir "!output!\!folder!"
      copy /Y "!input!\!file!" "!output!\!folder!" >nul
      echo Copied "!input!\!file!" to "!output!\!folder!\!file!"
      )
    )
    
    说明:

    这将提示用户输入
    目录。如果目录不存在,它将重新提示它,如果它确实存在,它将提示输入
    目的地
    目录,如果目的地路径无效,则回显它并重新提示输入

    接下来,我们获取每个文件并将其分配给变量名
    %file%
    ,或者更确切地说,在这个
    启用延迟扩展
    案例中
    !文件
    然后,对于每个文件名,我们将其按
    拆分,并将名称的第一部分分配给
    !文件夹。
    现在,我们只需检查文件夹是否存在于以前用户指定的目标中,如果不存在,则创建它,然后将
    源中的每个文件复制到创建新文件夹的匹配目标目录中


    如果您的文件布局与示例不符,请提供适当的示例,我将修改我的答案。

    根据您的示例判断:

    NewDoc_Ver1
    NewDoc_Ver2
    
    似乎您可能有一个公共分隔符,即
    \uu

    如果事实上是这样的,并且您只想将
    \uu
    之前的第一个单词作为文件夹名,那么这可能会有所帮助

    @echo off
    setlocal enabledelayedexpansion
    cls
    :input
    set /p "input=1. Enter Source directory: "
    if not exist "%input%" echo Invalid source: "%input%" enter valid path && goto :input 
    :output
    set /p "output=2. Select Destination Directory: "
    if not exist "%output%" echo Invalid Dest: "%output%" enter valid path && goto :output
    
    for %%i in (%input%\*) do (
     set "file=%%~nxi"
     for /f "delims=_" %%a in ("!file!") do (
     set "folder=%%a"
     if not exist "!output!\!folder!" mkdir "!output!\!folder!"
      copy /Y "!input!\!file!" "!output!\!folder!" >nul
      echo Copied "!input!\!file!" to "!output!\!folder!\!file!"
      )
    )
    
    说明:

    这将提示用户输入
    目录。如果目录不存在,它将重新提示它,如果它确实存在,它将提示输入
    目的地
    目录,如果目的地路径无效,则回显它并重新提示输入

    接下来,我们获取每个文件并将其分配给变量名
    %file%
    ,或者更确切地说,在这个
    启用延迟扩展
    案例中
    !文件
    然后,对于每个文件名,我们将其按
    拆分,并将名称的第一部分分配给
    !文件夹。
    现在,我们只需检查文件夹是否存在于以前用户指定的目标中,如果不存在,则创建它,然后将
    源中的每个文件复制到创建新文件夹的匹配目标目录中


    如果您的文件布局与示例不符,请提供适当的示例,我将修改我的答案。

    这里有一个示例脚本供您使用:

    @Echo关闭
    SetLocal EnableDelayedExpansion
    Set/P“dirSrc=输入文件源目录的完整路径:”
    Set/P“dirDst=输入保存目标目录的完整路径:”
    Set/P“numEnd=输入要右键修剪文件名的字符数:
    对于(“%dirSrc%\*”)中的%%A,请执行(设置“fileNm=%%~nA”
    如果“%numEnd%”=“0”(XCopy”%%A“%dirDst%\%%~nA\”2>num
    )否则XCopy“%%A”“%dirDst%\!fileNm:~,-%numEnd%!\”2>numl)
    

    只要输入数据正确,这应该可以正常工作。

    我希望您执行这些检查并验证输入数据,(您的最终用户可以输入他们想要的任何内容)。下面是一个供您使用的示例脚本:

    @Echo关闭
    SetLocal EnableDelayedExpansion
    Set/P“dirSrc=输入文件源目录的完整路径:”
    Set/P“dirDst=输入保存目标目录的完整路径:”
    Set/P“numEnd=输入要右键修剪文件名的字符数:
    对于(“%dirSrc%\*”)中的%%A,请执行(设置“fileNm=%%~nA”
    如果“%numEnd%”=“0”(XCopy”%%A“%dirDst%\%%~nA\”2>num
    )否则XCopy“%%A”“%dirDst%\!fileNm:~,-%numEnd%!\”2>numl)
    

    只要输入数据正确,这应该可以正常工作。

    我希望您执行这些检查并验证输入数据,(您的最终用户可以输入他们想要的任何内容)。

    显示您输入文件和预期输出的示例,此脚本似乎有点过火。显示您输入文件和预期输出的示例,这个脚本看起来有点过头了。我建议您更改
    的所有实例!输出
    !输入for
    循环中,code>分别指向
    %output%
    %input%
    。这将有望让那些难以理解延迟扩展的人看到,只有在循环中设置的变量才需要延迟扩展。我建议您更改
    的所有实例!输出
    !输入for
    循环中,code>分别指向
    %output%
    %input%
    。这将有希望让那些难以理解延迟扩展的人看到,只有在循环中设置的变量才需要它。@Jimmywillams,这不仅几乎击败了这个练习,而且我还希望您在输入数据检查中能够满足自己的需要!尽管如此,我还是更新了我的代码以适应这种情况。@Jimmywillams,这不仅几乎击败了练习,而且我还希望您在输入数据检查中能够满足自己的需要!尽管如此,我还是更新了代码以适应这种情况。