英文:
Create Directory and Copy files from different directory (shared location) in production using Windows batch scripting
问题
我有一个生产映射,其中文件夹中有更多文件需要从一个共享位置复制到另一个位置。
位置 A:D:\UK\UK0623\Path\Temp_Variable\ORIGINAL\test1.pdf,test2.pdf,.....
位置 B:D:\UK\UK0723\Path\Temp_Variable\Reissue\
如您所见,需要解决上述挑战,需要进行以下 3 个步骤:
- 从用户处获取父文件夹路径和子文件夹路径,并将它们分别保存在变量中,
父路径:D:\UK\UK0623\Path
子路径:D:\UK\UK0723\Path
-
从父路径中选择并保存第一个名称/文件夹名称作为 TEMP 变量,例如:D:\UK\UK0623\Path\Temp_Variable
-
循环遍历 TEMP 变量,因为我们有数百个文件夹名称可用,如 SNO_01、SNO_02 等。
-
进入原始文件夹(ParentPath + temp variable + \Original Folder)并复制原始文件夹中的文件,例如:D:\UK\UK0623\Path\Temp_Variable\Original...
-
对于子文件夹路径,将 TEMP 变量用于路径,然后创建一个 Reissue 文件夹,然后将文件粘贴到其中(ChildPath + temp variable + \Reissue Folder),例如:D:\UK\UK0723\Path\Temp_Variable\Reissue...
请注意:在生产环境中有数百个序列号或文件夹。
Reissue 文件夹需要为每个序列号 SNO_01、SNO_02... 在运行时创建。
我尝试了以下脚本,
@echo off
setlocal enabledelayedexpansion
pushd D:\Uk
SET CURRENT_DIR=%cd%
SET PARENT_DIR=%CURRENT_DIR%\UKRR_0623
SET CHILD_DIR=%CURRENT_DIR%\UKRR_0723
SET TEMP_VAR=SNO_01
echo %CURRENT_DIR%
echo %PARENT_DIR%
echo %CHILD_DIR%
for %%i in ("%CURRENT_DIR%\UKRR_0623\%TEMP_VAR%\Original*.*") do (
copy "%%i" "%CURRENT_DIR%\UKRR_0723\%TEMP_VAR%\Reissue")
echo backup completed
pause
它显示目录路径语法错误
编辑:
@echo off
setlocal enabledelayedexpansion
pushd D:\Uk
SET CURRENT_DIR=%cd%
SET PARENT_DIR=%CURRENT_DIR%\UKRR_0623
SET CHILD_DIR=%CURRENT_DIR%\UKRR_0723
SET TEMP_VARS=SNO_01 SNO_02
for %%i in (%TEMP_VARS%) do (
xcopy /s "%PARENT_DIR%\%%i\Original\*.*" "%CHILD_DIR%\%%i\Reissue"
)
pause
D:\Uk>(xcopy /s "D:\Uk\UKRR_0623\SNO_01 SNO_02\Original*.*" "D:\Uk\UKRR_0723\SNO_01 SNO_02\Reissue" )File not found - .
0 File(s) copied
请注意,您在脚本中应该使用`%%i`而不是`%TEMP_VARS%`,以便正确循环遍历每个临时变量。
<details>
<summary>英文:</summary>
I have a production mapping where the folder does have more files to copy from one shared location to the other location.
Location A: D:\UK\UK0623\Path\Temp_Variable\ORIGINAL\test1.pdf,test
2.pdf,.....
Location B: D:\UK\UK0723\Path\Temp_Variable\Reissue\
As you see the above challenge, need to work on 3 steps
1. Get parent folder path and child folder path from the User and save it in separate Variable till
parent path: D:\UK\UK0623\Path
child path: D:\UK\UK0723\Path
2. from the Parent path, select and save the first name/folder name as a TEMP variable
for example: D:\UK\UK0623\Path\Temp_Variable
3. Loop thru the TEMP_variable, because we have 100's of folder name available as SNO_01,SNO_02,etc..
4. get into the Original folder (ParentPath + temp variable + \Original Folder) and copy the files inside Original folder
for example: D:\UK\UK0623\Path\Temp_Variable\Original\...
5. to the child folder path, use TEMP variable into the path then, Create a Reissue folder, then paste the files in it (ChildPath + temp variable + \Reissue Folder)
for example: D:\UK\UK0723\Path\Temp_Variable\Reissue\...
Please note: there are 100's of Serial numbers or folders are there in prod.
Reissue folder needs to create runtime for every serial number SNO_01, SNO_02....
I tried the below script,
@echo off
setlocal enabledelayedexpansion
pushd D:\Uk
SET CURRENT_DIR=%cd%
SET PARENT_DIR=%CURRENT_DIR%\UKRR_0623
SET CHILD_DIR=%CURRENT_DIR%\UKRR_0723
SET TEMP_VAR=SNO_01
echo %CURRENT_DIR%
echo %PARENT_DIR%
echo %CHILD_DIR%
for %%i in ("%CURRENT_DIR%\UKRR_0623\%TEMP_VAR%\Original*.*") do (
copy "%%i" "%CURRENT_DIR%\UKRR_0723\%TEMP_VAR%\Reissue")
echo backup completed
pause
it shows the directory path syntax error
EDIT:
@echo off
setlocal enabledelayedexpansion
pushd D:\Uk
SET CURRENT_DIR=%cd%
SET PARENT_DIR=%CURRENT_DIR%\UKRR_0623
SET CHILD_DIR=%CURRENT_DIR%\UKRR_0723
SET TEMP_VARS=SNO_01 SNO_02
for %%i in (%TEMP_VARS%) do (
xcopy /s "%PARENT_DIR%\%TEMP_VARS%\Original\*.*"
"%CHILD_DIR%\%TEMP_VARS%\Reissue"
)
pause
D:\Uk>(xcopy /s "D:\Uk\UKRR_0623\SNO_01 SNO_02\Original\*.*" "D:\Uk\UKRR_0723\SNO_01 SNO_02\Reissue" )File not found - *.*
0 File(s) copied
</details>
# 答案1
**得分**: 1
首先,你的脚本无法正常运行:设置语法错误,变量使用错误,还有其他一些小错误...
1 - 为什么你以 `` \` `` 开始?请替换为只有 `` @echo off ``(同样适用于最后一行,只使用 ``pause``)
2 - 你的设置也不正确,你需要使用以下语法(代码、等号和值之间没有空格+不需要在 ``%`` 中写所有内容,它是为变量准备的):
```shell
set CODE=VALUE
3 - 要使用一个使用 set
定义的变量,你只需要在代码之间使用 %
。要打印变量的内容,你可以这样做:
echo %code%
当你运行脚本时,你会看到以下输出:
VALUE
4 - 另一个小错误,当你使用路径时,请将其放在双引号中(以防止空格引起的错误)。所以要切换到你的 CURRENT_DIR
目录:
cd "%CURRENT_DIR%"
5 - 你的 for 循环看起来不错,但确保所有的拷贝都在同一行上,并使用括号确保它将计算所有东西:
for %%i in ("%PARENT_DIR%\i\Original\*.txt") do (
copy "%%i" "%CHILD_DIR%\i\Reissue"
)
如果按照我说的修改一切,应该可以正常工作(不要忘记编辑你的问题以显示结果)。
如果需要进一步解释,请随时提问!
附言:如果这解决了你的问题,请不要忘记将其标记为答案!
英文:
First of all, your script CAN'T work : wrong set syntax, wrong usage of variables, other small mistakes...
1 - Why did you start with \`
? replace it with only @echo off
(same thing goes for the last line, only use pause
)
2 - Your sets are wrong too, you need to write them with the syntax (no spaces between the code, the equal and the value + no need to write everything between %
its for the variables) :
set CODE=VALUE
3 - To use a variable (defined with set
) you just need to write the code between %
. To print the content of a variable you can do :
echo %code%
And you'll see the output below when you run the script
VALUE
4 - Another small mistake, when you use a path, write it between double quotes (to prevent errors with white spaces). So to change directory to your CURRENT_DIR
:
cd "%CURRENT_DIR%"
5 - Your for loop looks good but be sure to have all your copy on the same line and use parenthesis to be sure it will count everyting :
for %%i in ("%PARENT_DIR%\i\Original\*.txt") do (
copy "%%i" "%CHILD_DIR%\i\Reissue"
)
If you change everything as I said it should work (don't forget to edit your question to show us the result).
Feel free to ask for further explanations !
PS : don't forget to mark this as the answer if it solved your problem
EDIT :
In answer at your comment :
>the temporary variable or Directory should change is SNO_01 from both source and destination path, I guess need to use for loop based on the SNO_01,SNO_02,SNO_03, etc...then I need to xcopy by changing the path, Can you help on how to loop this in both source and destination path
You need to loop through different names/values(and copy recursively the files in these folders), to do it, just place the xcopy
command in the loop and use the loop variable %%i
. In order to do it just do this :
for %%i in (SNO_01 SNO_02 SNO_03 SNO_0N) do (
xcopy "%CURRENT_DIR%\%%i\Original" "%CURRENT_DIR%\%%i\Reissue"
)
The values between the parenthesis needs to be separated by spaces only and you can replace it by a variable to have a better format:
SET TEMP_VARS=SNO_01 SNO_02 SNO_03 SNO_0N
for %%i in (%TEMP_VARS%) do (
xcopy "%CURRENT_DIR%\%%i\Original" "%CURRENT_DIR%\%%i\Reissue"
)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论