我需要使用 Powershell 将文件夹从一个网络文件夹移动(而不是复制然后删除,为了进行文件验证)到另一个网络文件夹。
我已经尝试过Move-Item
(test1
文件夹在哪里):
PS C:\Users\user\Documents> Move-Item test1 \\SomeServer\c$\some_folder\
Move-Item : Source and destination path must have identical roots. Move will not work across volumes.
At line:1 char:10
+ Move-Item <<<< test1 \\SomeServer\c$\some_folder\
+ CategoryInfo : WriteError: (C:\Users\user\Documents\test1:DirectoryInfo) [Move-Item], IOExce
ption
+ FullyQualifiedErrorId : MoveDirectoryItemIOError,Microsoft.PowerShell.Commands.MoveItemCommand
我是不是漏掉了一些简单的东西?有没有简单的方法可以做到这一点?
我确实尝试过robocopy
:
robocopy /MOVE test1 \\SomeServer\c$\some_folder\
这种方法部分奏效了,但丢失了test1
文件夹(意味着test
没有出现在 上some_folder
),只有该文件夹中的文件出现在\\SomeServer\c$\some_folder\
结果看起来应该是这样的:
工作目录(移动前):
- test1(包含文件的文件夹)
- test2(包含文件的文件夹)
- test3(包含文件的文件夹)
- 文件.txt
工作目录(移动后):
- test2(包含文件的文件夹)
- test3(包含文件的文件夹)
- 文件.txt
\\SomeServer\c$\some_folder\(移动后预期):
- test1(包含文件的文件夹)
问题是,当我使用 robocopy 时,结果显示files in it
在结果中但没有test1
文件夹......
我已尝试使用 /s 和 /move 来复制 robocopy,但仍然没有成功。
我发现了类似的东西:
set folder="test1"
robocopy /MOVE "%folder%" "\\SomeServer\c$\some_folder\%folder%"
几乎可以工作,但是文件夹元数据(修改/创建日期)丢失了,需要保留。
答案1
以下是使用 Robocopy 移动整个文件夹( )复制到不同服务器上的test1
另一个文件夹( ),同时保留日期戳等:some_folder
ROBOCOPY "test1" "\\SomeServer\c$\some_folder\test1" /MOVE /COPY:DAT /DCOPY:T
根据ROBOCOPY /?
使用信息:
/COPY:copyflag[s] :: 要复制的文件内容(默认为 /COPY:DAT)。 (复制标志:D=数据、A=属性、T=时间戳)。 (S=安全=NTFS ACL,O=所有者信息,U=审核信息)。 /DCOPY:T :: 复制目录时间戳。
答案2
尝试使用 PowerShell 3 - 我认为 Move-Item 的一些限制已被消除。
以下 PowerShell 脚本将Copy-Item
在 且compare-object
仅Remove-Item
当 相等 时执行:
$source = "<UNC Path>"
$destination = "<UNC Path>"
if (test-path $destination -PathType Container)
{
foreach ( $srcObj in (get-childitem $source ))
{
$srcObjPath = "$($srcObj.fullname)"
$destObjPath = "$($destination)\$($srcObj.name)"
If((Test-Path -LiteralPath $destination))
{
copy-item $srcObjPath $destination -recurse
if ( (Test-Path -Path $destObjPath ) -eq $true)
{
if ( (compare-object (gci $srcObjPath -recurse) (gci $destObjPath -recurse)) -eq $null)
{
write-output "Compare is good. Remove $($srcObjPath)"
remove-item $srcObjPath -recurse
}
else
{
write-output "Compare is bad. Remove $($destObjPath)"
remove-item $destObjPath -recurse
}
}
else
{
write-output "$($destination) path is bad"
}
}
else
{
write-output "bad destinaton: $($destination)"
}
}
}
答案3
我在这里有点新,但是...使用 Robocopy 复制内容使用如下语法:
robocopy \\source_host\source_dir \\dest_host\dest_dir *
其中,*(表示全部)或要复制的文件列表。
就我个人而言,我无法使用 robocopy 这种“直接方式”(源/目标)复制目录。只能使用参数/MIR
。
答案4
我要做的是在同一脚本中映射网络位置并执行“驱动器”,然后在最后断开连接。我还会简单地使用MOVE
命令
例如
NET USE S: \\networkLocation\c$\newDir
MOVE "C:\user\desktop\working dir\test1" S:
NET USE S: /DELETE