powershell 复制-项目和排除文件夹

of1yzvn4  于 2023-08-05  发布在  Shell
关注(0)|答案(5)|浏览(180)

我需要将所有c:\inetpub目录复制到新位置,但不包括以下文件夹及其子文件夹:

c:\inetpub\custerr
c:\inetpub\history
c:\inetpub\logs
c:\inetpub\temp
c:\inetpub\wwwroot

字符串
到目前为止,我正在这样做:

# Directory name is created with a format string
$dirName = "\\servername\folder1 _ {0}\inetpub" -f (get-date).ToString("yyyy-MM-dd-hh-mm-ss")
$dirName # Check the output

# Create dir if needed
if(-not (test-path $dirName)) {
    md $dirName | out-null
} else {
    write-host "$dirName already exists!"
}

#Copy Backup File to Dir
Copy-Item "\\servername\c$\inetpub\*" $dirName -recurse

xa9qqrwz

xa9qqrwz1#

这是一个你可以做的简单的例子。生成要排除的父文件夹的数组。因为你是通过UNC路径访问它们的,所以我们不能真正使用c:\路径(我们可以绕过这个,但是我将要展示的应该足够好了。
然后使用Get-ChildItem获取inetpub目录中的所有文件夹。使用-notin过滤掉排除项,并将其余项传递给Copy-Item

$excludes = "custerr","history","logs","temp","wwwroot"
Get-ChildItem "c:\temp\test" -Directory | 
    Where-Object{$_.Name -notin $excludes} | 
    Copy-Item -Destination $dirName -Recurse -Force

字符串
您需要至少PowerShell 3.0才能工作。

cygmwpex

cygmwpex2#

哦,答案很简单,但似乎我们都是PowerShell新手。

New-Item -ItemType Directory -Force -Path $outDir # directory must exist
Copy-Item $inDir\* $outDir -Exclude @("node_modules",".yarn") -Recurse

字符串
\*让它工作的。
PowerShell很棒,但...

jljoyd4f

jljoyd4f3#

Copy-Item -Path (Get-Item -Path "$path\*" -Exclude ('Folder1', 'File.cmd', 'File.exe', 'Folder2')).FullName -Destination $destination -Recurse -Force

字符串
替换:
$path按源文件夹
('Folder1', 'File.cmd', 'File.exe', 'Folder2')由您的特定文件/文件夹排除
$destination按目标文件夹

hgqdbh6s

hgqdbh6s4#

我写了这个供日常使用,并将其打包在脚本模块中,它维护了所有的目录结构并支持通配符:

function Copy-Folder {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [String]$FromPath,

        [Parameter(Mandatory)]
        [String]$ToPath,

        [string[]] $Exclude
    )

    if (Test-Path $FromPath -PathType Container) {
        New-Item $ToPath -ItemType Directory -ErrorAction SilentlyContinue | Out-Null
        Get-ChildItem $FromPath -Force | ForEach-Object {
            # avoid the nested pipeline variable
            $item = $_
            $target_path = Join-Path $ToPath $item.Name
            if (($Exclude | ForEach-Object { $item.Name -like $_ }) -notcontains $true) {
                if (Test-Path $target_path) { Remove-Item $target_path -Recurse -Force }
                Copy-Item $item.FullName $target_path
                Copy-Folder -FromPath $item.FullName $target_path $Exclude
            }
        }
    }
}

字符串
就叫Copy-Folder -FromPath inetpub -ToPath new-inetpub -Exclude custerr,history,logs,temp,wwwroot
-FromPath-ToPath可以省略,
Copy-Folder inetpub new-inetpub -Exclude custerr,history,logs,temp,wwwroot

ca1c2owp

ca1c2owp5#

你可以沿着以下方式做一些事情:

?{$_.fullname -notmatch '\\old\\'}

字符串
在你得到你所有的文件夹来过滤它们之后。
此示例将排除名称中包含“old”的任何内容。您可以对要排除的目录执行此操作。
一个完整的例子:

C:\Example*" -include "*.txt -Recurse |
  ?{$_.fullname -notmatch '\\old\\'}|
    % {Copy-Item $_.fullname "C:\Destination\"}


对于多个排除,您可以使用-And

C:\Example*" -include "*.txt -Recurse |
  ?{$_.fullname -notmatch '\\old\\' -And $_.fullname -notmatch '\\old2\\'}|
    % {Copy-Item $_.fullname "C:\Destination\"}

相关问题