假设我有这个文件夹结构:
02548 //let's call this MASTER FOLDER, folder name are using site_id
|- 1. Master File
|- 02548_MSFI.pdf
|- 2. src
|- 02548_main.cpp
|- 3. Backup
|- alpha.svn
我还有site_id.txt文件包含side_id的名称:
02548
03584
05482
07992
05861
我想要做的是将 MASTER FOLDER 复制到新文件夹。所以,最终结果将是这样的:
|-02548 // MASTER FOLDER
| |- 1. Master File
| |- 02548_MSFI.pdf
| |- 2. src
| |- 02548_main.cpp
| |- 3. Backup
| |- alpha.svn
|-03584 //the folder name are taken from the list inside the site_id.txt
| |- 1. Master File
| |- 03584_MSFI.pdf //please notice the prefix of this file's name
| |- 2. src
| |- 03584_main.cpp //please notice the prefix of this file's name
| |- 3. Backup
| |- alpha.svn
|-05482 //the folder name are taken from the list inside the site_id.txt
| |- 1. Master File
| |- 05482_MSFI.pdf //please notice the prefix of this file's name
| |- 2. src
| |- 05482_main.cpp //please notice the prefix of this file's name
| |- 3. Backup
| |- alpha.svn
and so on until all the site_id from site_id.txt are here.
在现实世界中,site_id.txt将包含超过1000个列表。因此,手动执行此操作将非常痛苦。 如何使用批处理脚本或PowerShell执行此操作?
答案 0 :(得分:1)
不知道你会怎么做,但如果我找到一份工作并且该任务被分配给我,我就会这样做:
Address 10.11.12.13 -> 00001010000010110000110000001101
Mask 255.255.192.0 -> 11111111111111111100000000000000
AND ================================
Network -> 00001010000010110000000000000000 -> 10.11.0.0
您需要更改@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "filename1=%sourcedir%\q44093158.txt"
FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO (
XCOPY /s /e "%sourcedir%\t w o\*" "%destdir%\%%a\" >nul
FOR /f "delims=" %%p IN ('dir /s /b "%destdir%\%%a\*#*"') DO (
SET "filename=%%~nxp"
CALL set "filename=%%filename:#=%%a%%"
CALL REN "%%p" "%%filename%%"
)
)
GOTO :EOF
和sourcedir
的设置以适合您的具体情况。
我使用了一个名为destdir
的文件,其中包含我的测试数据。
在源目录中,(我实际测试时附加了q44093158.txt
以确保它与包含空格的目录名一起工作),构建包含master文件的结构,其中branch-number替换为\t w o
代码只读取#
,其中包含一行的分支名称,复制目标的目录结构,然后查找包含filename1
的文件名。使用这些文件,它会替换#
的分支名称并重命名文件。
完成!
答案 1 :(得分:0)
此PowerShell脚本和文件site_id.txt应放在02548
## C:\Test\Copy-Template.ps1
$template = '02548'
foreach ($site in (Get-Content site_id.txt)) {
Get-ChildItem $template -recurse | Foreach-Object {
$NewName = $_.FullName -replace $template,$site
if ($_.PSIsContainer){
if (!(Test-path $NewName)){md $NewName|Out-Null}
} else {
copy $_.FullName $NewName -EA 0
}
}
}
示例输出:
> tree /F
C:.
│ Copy-Template.ps1
│ site_id.txt
│
└───02548
├───1. Master File
│ 02548_MSFI.pdf
│
├───2. src
│ 02548_main.cpp
│
└───3. Backup
alpha.svn
> .\Copy-Template.ps1
> tree /f
C:.
│ Copy-Template.ps1
│ site_id.txt
│
├───02548
│ ├───1. Master File
│ │ 02548_MSFI.pdf
│ │
│ ├───2. src
│ │ 02548_main.cpp
│ │
│ └───3. Backup
│ alpha.svn
│
├───03584
│ ├───1. Master File
│ │ 03584_MSFI.pdf
│ │
│ ├───2. src
│ │ 03584_main.cpp
│ │
│ └───3. Backup
│ alpha.svn
│
├───05482
...
├───05861
...
└───07992
├───1. Master File
│ 07992_MSFI.pdf
│
├───2. src
│ 07992_main.cpp
│
└───3. Backup
alpha.svn
答案 2 :(得分:0)
@echo off
setlocal EnableDelayedExpansion
rem Call the subroutine, read data from site_id file
call :DuplicateTree < site_id.txt
goto :EOF
:DuplicateTree
rem Read MasterFolder from first line
set /P "masterFolder="
:nextFolder
rem Read and process next folders until EOF
set /P "nextFolder="
if errorlevel 1 exit /B
rem Duplicate folders first
md "%nextFolder%"
for /R "%masterFolder%" /D %%a in (*) do (
set "folder=%%a"
set "folder=!folder:*%cd%\=!"
md "!folder:%masterFolder%=%nextFolder%!"
)
rem Duplicate files
for /R "%masterFolder%" %%a in (*) do (
set "file=%%a"
set "file=!file:*%cd%\=!"
copy "%%a" "!file:%masterFolder%=%nextFolder%!"
)
goto nextFolder
将此批处理文件放在包含site_id.txt
文件和02548
主文件夹的同一文件夹中。