2012-09-16 127 views
1

我想创建一个目录结构,如果它不存在于另一个位置。它可以工作,但是在名称中带有括号的任何目录中都会出现错误。我想我必须以某种方式逃避,但不知道如何。创建目录结构,如果它不存在Powershell

Script代码:

$source = "c:\data" 
$destination = "c:\scrap\data" 

Get-ChildItem -Path $source -Recurse -Force | 
    Where-Object { $_.psIsContainer } | 
    ForEach-Object { $_.FullName -replace [regex]::Escape($source), $destination } | 
    ForEach-Object { 
    if (!(Test-Path -path $_)) { $null = New-Item -ItemType Container -Path $_ } 
    } 
+0

“它的工作原理,但我得到一个错误。”这是否意味着它的工作* besdies *有错误的地方,或即使括号目录工作正常,只有错误文本写入?如果是后者,只需将'-ErrorAction SilentlyContinue'添加到抛出无用错误的cmdlet中即可。 – latkin

+0

适合我,没有错误。你得到的错误是什么?请将'$ error [0] .exception.tostring()'的输出添加到您的帖子中。 –

+0

如果名称中包含一个括号的目录已经存在,它会尝试再次创建并且出现错误: 'New-Item:具有指定名称C:\ scrap \ data \ Evernote \ backup \ Untitled note的项目[2] _文件已经存在。 在C:\ data \ PowerShell \ Untitled5.ps1:9 char:67 + ForEach-Object {if(!(Test-Path -path $ _)){$ null = New-Item <<<< -ItemType Container (C:\ scrap \ data \ E ... note [2] _files:String)[New-Item],IOException + FullyQualifiedErrorId:DirectoryExist,Microsoft.PowerShell.Commands .NewItemCommand' – user1612851

回答

2

明白了。错误是由于方括号。他们使用模式匹配(见here),所以实际上Test-Path检查

C:\scrap\data\Evernote\backup\Untitled note 2_files

不存在。你必须使用-LiteralPath来避免这种情况。

5

这里有一个较短的解决方案:

Copy-Item -Path $source -Destination $destination -Filter {$_.PSIsContainer} -Recurse -Force 
相关问题