Posted on ::

以 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
Table of Contents