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
@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,这不仅几乎击败了练习,而且我还希望您在输入数据检查中能够满足自己的需要!尽管如此,我还是更新了代码以适应这种情况。