我正在把我的服务器从2003年迁移到2008年,并试图编写一个PowerShell脚本,将所有文件从vbs和bat从2003服务器复制到2008年服务器,并保持文件夹结构的机智,因为这是至关重要的该程序运行。
这是我到目前为止。 它工作挺好。 它将在新服务器上创buildD:\folder
,但不会复制任何内容。 它还创build了具有所有vbs和bat文件的名称以及path的log.txt
。
New-PSDrive -name source -PSProvider FileSystem -root "\\servername\d$\folder" |Out-Null $targetdirectory = "d:\folder" $sourcedirectory = "\\servername\d$\folder" Get-ChildItem -Path $sourcedirectory -filter "*.bat","*.vbs" -Recurse| Out-File D:\log.txt if ( -Not (Test-Path $targetdirectory)) {New-Item -path $targetdirectory -Type Directory | out-null } Copy-Item -Path $sourcedirectory -filter "*.bat","*.vbs" -Destination $targetdirectory -recurse -force remove-psdrive -name source
不工作的部分是这个
Copy-Item -Path $sourcedirectory -filter "*.bat","*.vbs" -Destination $targetdirectory -recurse -force
我只是改变了
Get-ChildItem -Path $sourcedirectory -Include "*.bat","*.vbs" -Recurse| Out-File D:\log.txt if ( -Not (Test-Path $targetdirectory)) {New-Item -path $targetdirectory -Type Directory | out-null } Copy-Item -Path $sourcedirectory -Include *.bat, *.vbs -Destination $targetdirectory -recurse -force
使用robocopy会更容易。
robocopy source dest *.vbs *.bat /s
从另一个答案阅读评论它看起来像你有问题筛选某些文件与Copy-Item
是的? 在大多数情况下,您会看到使用Get-ChildItem
将您想要的文件和管道隔离到Copy-Item
。 你几乎已经这样做了。
$files = Get-ChildItem -Path $sourcedirectory -filter "*.bat","*.vbs" -Recurse $files | Out-File D:\log.txt $files | Copy-Item -Destination $targetdirectory -Force
$files
包含你想要隔离哪些文件(你可以将它管入到Where-Object
来获得一定大小的文件,如果需要的话)。 获取文件并将结果输出到外部txt文件(使用Export-CSV
可以使对象FYI的输出更清晰)。 然后我们简单地将它管入Copy-Item
。 无需再次尝试文件。