当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] Copy-Item :像 PowerShell 中的老板一样复制文件

作者:精品下载站 日期:2024-12-14 12:36:49 浏览:13 分类:玩电脑

Copy-Item :像 PowerShell 中的老板一样复制文件


复制文件。这并不性感,但必须要做。在 GUI 中,我们使用剪贴板进行复制和粘贴,但在 PowerShell 中,我们有一个名为 Copy-Item 的 cmdlet。

用于复制文件的命令在所有 shell 语言中一直存在。在 PowerShell 领域,从 A 点到 B 点获取 PowerShell 脚本中的文件或文件夹副本的最流行方法是使用 PowerShell Copy-Item cmdlet。此 cmdlet 允许我们复制文件和文件夹,同时使我们能够递归文件夹中的文件、使用通配符选择我们需要复制的文件,甚至使用 PowerShell Remoting 进行文件复制!

is cmdlet 是 PowerShell 提供程序 cmdlet 的一部分。它是一个通用 cmdlet,由其 Item 名词识别。这些提供程序 cmdlet 中的大多数都可以跨不同的提供程序使用,但在我使用 PowerShell 的近 10 年中,我只见过 Copy-Item 与文件系统提供程序一起使用。

通过使用此 cmdlet,PowerShell 允许开发人员以多种不同的方式复制文件和文件夹。

基本用法

最基本的是,Copy-Item cmdlet 使用 Path 参数作为源文件路径和 Destination 将单个文件从 A 点复制到 B 点 参数作为目标文件夹路径。

PS> Test-Path -Path C:\PointB.txt
False
PS> Copy-Item -Path C:\PointA.txt -Destination C:\PointB\
PS> Test-Path -Path C:\PointB.txt
True 

此 cmdlet 还可以复制空文件夹。我将列出 C:\EmptyFolder 文件夹中的项目,然后将其复制出来。

PS> Get-ChildItem -Path C:\EmptyFolder\
PS> Test-Path -Path C:\PointB\EmptyFolder -PathType Container
False
PS> Copy-Item -Path C:\EmptyFolder\ -Destination C:\PointB\
PS> Test-Path -Path C:\PointB\EmptyFolder -PathType Container
True 

也许该文件夹中有一个只读文件。默认情况下,Copy-Item 不会覆盖它。要强制覆盖,只需添加 Force 参数即可。

使用 Copy-Item 进行选择性

除了复制单个文件或文件夹之外,我们还可以复制文件夹的全部内容。 Copy-Item 的 Path 参数接受通配符,如星号以匹配一个或多个字符,或问号以仅匹配单个字符。

PS> @(Get-ChildItem -Path C:\PointB).Count
0
PS> @(Get-ChildItem -Path C:\PointA).Count
10000
PS> @(Get-ChildItem -Path C:\PointB).Count
0
PS> Copy-Item -Path C:\PointA\* -Destination C:\PointB\
PS> @(Get-ChildItem -Path C:\PointB).Count
10000
PS> @(Get-ChildItem -Path C:\PointB).Count
0
PS> Copy-Item -Path 'C:\PointA?0.txt' -Destination C:\PointB\
PS> Get-ChildItem -Path C:\PointB\

Directory: C:\PointB
Mode                LastWriteTime         Length Name
-a----        8/11/2017   8:59 AM              5 2600.txt
-a----        8/11/2017   8:59 AM              5 2610.txt
-a----        8/11/2017   8:59 AM              5 2620.txt
-a----        8/11/2017   8:59 AM              5 2630.txt
-a----        8/11/2017   8:59 AM              5 2640.txt
-a----        8/11/2017   8:59 AM              5 2650.txt
-a----        8/11/2017   8:59 AM              5 2660.txt
-a----        8/11/2017   8:59 AM              5 2670.txt
-a----        8/11/2017   8:59 AM              5 2680.txt
-a----        8/11/2017   8:59 AM              5 2690.txt

将多个文件夹合并在一起

Copy-Item 的另一个很酷的功能是它能够同时复制多个文件夹。通过将多个路径传递给 Path 参数,Copy-Item 将查看每个路径,根据路径复制文件夹或文件并“合并”它们全部进入同一个目的地。

PS> Copy-Item -Path C:\PointB\*,C:\PointC\*,C:\PointD\* -Destination C:\PointE
PS> Get-ChildItem -Path C:\PointE

Directory: C:\PointE
Mode                LastWriteTime         Length Name
-a----       11/11/2017  12:15 PM              2 PointBFile.txt
-a----       11/11/2017  12:15 PM              2 PointCFile.txt
-a----       11/11/2017  12:16 PM              4 PointDFile.txt

递归复制文件

您很可能不会很幸运,将所有文件都放在一个文件夹中,而其中也没有文件夹。我们通常会遇到这样的情况:父文件夹中有很多子文件夹,我们也想复制其中的文件。通过在Copy-Item上使用Recurse参数,它会很乐意在每个子文件夹中查找并递归地复制每个子文件夹中的所有文件和文件夹。

请注意,我将文件和文件夹从 Get-ChildItem 直接通过管道传输到 Copy-ItemCopy-Item 有管道支持!

PS> (Get-ChildItem -Path C:\PointB\ -Recurse).Count
5
PS> Get-ChildItem -Path C:\PointB\ | Copy-Item -Destination C:\PointC -Recurse
PS> (Get-ChildItem -Path C:\PointC\ -Recurse).Count
5

使用 PassThru 参数的优点

PowerShell 中的许多 cmdlet 都有 PassThru 参数。通常不返回任何内容的 Cmdlet 可以使用 PassThru 参数返回它们正在操作的对象。此 cmdlet 没有什么不同。当我第一次开始编写脚本时,我从未使用过这个参数,因为我觉得不需要。

例如,如果我想将文件复制到远程位置,然后在脚本中引用该文件,我会执行以下操作:

$remoteFilePath = '\WEBSRV1\c$\File.txt'
Copy-Item -Path C:\File.txt -Destination $remoteFilePath
Write-Host "I've just copied the file to $remoteFilePath"

这种方法有效,但还可以更好。为什么不直接捕获使用 PassThru 参数时从 Copy-Item cmdlet 返回的对象,而不是为远程路径定义变量呢?返回的对象将始终具有目标文件路径。

$copiedFile = Copy-Item -Path C:\File.txt -Destination '\WEBSRV1\c$'

使用 PowerShell 远程会话复制文件

PowerShell v5 附带的一项很酷的功能是,该 cmdlet 能够不使用默认的 SMB 协议来传输文件,而是使用 WinRM 和 PowerShell 远程会话。通过使用 Session 参数,Copy-Item 使用现有的 PowerShell 会话并以这种方式传输文件。这是绕过防火墙的好方法,并且当会话通信被加密时,这也是一个额外的安全层。

PS> $session = New-PSSession -ComputerName WEBSRV1
PS> Invoke-Command -Session $session -ScriptBlock { Test-Path -Path C:\File.txt }
False
PS> Copy-Item -Path C:\File.txt -ToSession $session -Destination 'C:\'
PS> Invoke-Command -Session $session -ScriptBlock { Test-Path -Path C:\File.txt }
True

我们可以通过 SMB 复制 File.txt 文件,并希望 C$ 管理共享可用并使用 \\WEBSRV1\c$。由于我们使用了 ToSession 参数,因此目标路径将始终是运行远程会话的计算机的本地路径。

概括

Copy-Item cmdlet 是您将反复使用的核心 PowerShell cmdlet 之一。在 PowerShell 中,以多种不同的方式复制文件、文件夹,它简单但功能强大,特别是它能够使用通配符、将多个文件文件夹合并在一起以及使用现有的 PowerShell 远程会话!

进一步阅读

  • Robocopy 终极指南

[玩转系统] Copy-Item :像 PowerShell 中的老板一样复制文件

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯