演示:批量替换同名文件
以 Windows 操作系统为例,以下是仅替换同名文件的演示:
powershell(替换时复制文件)
# 1. 强制脚本以管理员权限运行
if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
Start-Process powershell.exe -ArgumentList "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs
Exit
}
# 2. 定义源目录和目标目录
$sourceDir = "C:\Users\Fidel\Downloads\JRE"
$targetDir = "C:\Program Files\scilab-6.1.1\java\JRE"
Write-Host "开始检查并替换同名文件..." -ForegroundColor Cyan
# 3. 遍历目标目录中的所有文件
Get-ChildItem -Path $targetDir -Recurse -File | ForEach-Object {
# 计算该文件在源目录中对应的相对路径
$relativePath = $_.FullName.Substring($targetDir.Length)
$sourceFile = Join-Path $sourceDir $relativePath
# 4. 条件判断:如果源目录中存在完全同名的文件,则执行替换
if (Test-Path $sourceFile) {
Write-Host "正在替换: $relativePath" -ForegroundColor Yellow
# 备份目标文件原有的权限(ACL)
$originalAcl = Get-Acl -Path $_.FullName
# 覆盖替换文件(-Force 确保只读文件也能被覆盖)
Copy-Item -Path $sourceFile -Destination $_.FullName -Force
# 5. 将原有的权限恢复到新替换的文件上
Set-Acl -Path $_.FullName -AclObject $originalAcl
}
}
Write-Host "替换完成!所有同名文件已更新,且权限保持一致。" -ForegroundColor Green
Pause
bat(替换时移动文件)
@echo off
:: 1. 强制脚本以管理员权限运行
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
cd /d "%~dp0"
:: 2. 定义源目录和目标目录
set "source_dir=C:\Users\Fidel\Downloads\JRE"
set "target_dir=C:\Program Files\scilab-6.1.1\java\JRE"
echo 正在开始检查并移动替换同名文件...
echo ---------------------------------------------------
:: 3. 调用 robocopy 核心命令
:: /S : 复制子目录(包含空目录)
:: /XL : 排除新文件(eXclude Extra)- 只操作目标目录中已存在的同名文件
:: /MOV : 移动文件(复制到目标后,自动删除源文件)
:: /COPY:DAT : 只复制数据(D)、属性(A)、时间戳(T),故意忽略原安全权限,让其继承目标原有的权限
:: /R:1 /W:1 : 遇到文件锁定或占用时,重试1次,等待1秒,避免卡死
robocopy "%source_dir%" "%target_dir%" /S /XL /MOV /COPY:DAT /R:1 /W:1
echo ---------------------------------------------------
echo 移动替换完成!所有同名文件已更新,且权限与目标环境保持一致。
pause