You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell脚本Get-ChildItem错误读取本地目录而非映射共享目录问题

PowerShell脚本误操作本地目录的问题修复

问题原因

  • 用New-PSDrive创建的Q盘默认仅在当前PowerShell会话内可见,如果脚本在非交互式环境(比如任务计划)运行,或者映射失败时,Get-ChildItem "Q:\"会找不到目标路径,自动 fallback到当前工作目录,导致误移本地文件。
  • 你添加的Remove-Item属于多余操作,跨卷(共享卷→本地卷)执行Move-Item时,PowerShell会直接将文件从源位置移动到目标位置,原文件会被自动删除,之前的“原文件未删除”大概率是因为Q盘映射失败,根本没操作到共享目录。

修复后的脚本

$cnt = 4
$connected = $false
$targetShare = "\\192.168.1.199\shared"
$localDest = "C:\Server_Files"

while ($cnt -gt 0) {
    if (Test-Connection 192.168.1.199 -Quiet -Count 1) {
        if (!$connected) {
            # 创建持久化映射,确保在会话外也能访问;捕获映射失败错误
            try {
                New-PSDrive -Name "Q" -Root $targetShare -PSProvider FileSystem -Persist -ErrorAction Stop
                Write-Host "成功映射Q盘到共享目录"
            }
            catch {
                Write-Host "Q盘映射失败:$_"
                $connected = $false
                start-sleep -Seconds 60
                $cnt--
                continue
            }
        }

        # 先检查Q盘是否存在,避免 fallback到当前目录
        if (Test-Path "Q:\") {
            Get-ChildItem -Path "Q:\" -Recurse -File | ForEach-Object {
                $destPath = Join-Path -Path $localDest -ChildPath $_.Name
                # 处理重名文件:目标已存在则添加时间戳后缀
                if (Test-Path $destPath) {
                    $fileName = $_.BaseName
                    $extension = $_.Extension
                    $timestamp = Get-Date -Format "yyyyMMddHHmmss"
                    $destPath = Join-Path -Path $localDest -ChildPath "$fileName`_$timestamp$extension"
                }
                try {
                    Move-Item -Path $_.FullName -Destination $destPath -Force -ErrorAction Stop
                    Write-Host "成功移动文件:$($_.FullName) → $destPath"
                }
                catch {
                    Write-Host "移动文件失败:$_"
                }
            }
        }
        else {
            Write-Host "Q盘不存在,跳过文件移动操作"
        }
        $connected = $true
    }
    else {
        if ($connected) {
            try {
                Remove-PSDrive -Name "Q" -Force -ErrorAction Stop
                Write-Host "已断开Q盘映射"
            }
            catch {
                Write-Host "断开Q盘映射失败:$_"
            }
        }
        $connected = $false
    }
    start-sleep -Seconds 60
    $cnt--
}

# 脚本结束后清理映射
if ($connected) {
    try {
        Remove-PSDrive -Name "Q" -Force -ErrorAction Stop
        Write-Host "脚本结束,已断开Q盘映射"
    }
    catch {
        Write-Host "脚本结束时断开Q盘映射失败:$_"
    }
}

关键修改说明

  • 给New-PSDrive添加-Persist参数,让Q盘映射在系统层面可见,避免非交互式环境下无法访问。
  • 每次操作前用Test-Path "Q:\"检查映射有效性,防止找不到路径时误操作本地目录。
  • 移除多余的Remove-Item,跨卷Move-Item会自动删除原文件。
  • 增加重名文件处理逻辑,避免因目标目录有同名文件导致脚本中断。
  • 添加try/catch错误捕获和日志输出,方便排查映射或移动失败的原因。
  • 给Test-Connection加上-Count 1,减少网络检测等待时间。

内容的提问来源于stack exchange,提问作者user720856

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 08:02:06