PowerShell复制项目方法失败 - 文件名中有括号

5
我将使用PowerShell(v.1)来复制与模式匹配的文件。文件命名约定为:
Daily_Reviews[0001-0871].journal
Daily_Reviews[1002-9887].journal
[...]

当我运行它时, "Copy-Item" 方法抱怨:
动态参数不能检索到 cmdlet。指定的通配符模式无效:Daily_Reviews[0001-0871].journal + Copy-Item <<<< $sourcefile $destination
该错误是由于文件名中的 "[" 和 "]" 引起的。当我删除左右括号时,它按预期工作。但是看起来 PowerShell 1 没有 -LiteralPath 标志,那么是否有另一种方法可以让带有括号的文件名在 PowerShell 1 中使用 Copy-Item?
$source = "C:\Users\Tom\"
$destination ="C:\Users\Tom\Processed\"

if(-not(Test-Path $destination)){mkdir $destination | out-null}


ForEach ($sourcefile In $(Get-ChildItem $source | Where-Object { $_.Name -match "Daily_Reviews\[\d\d\d\d-\d\d\d\d\].journal" }))
{

  Copy-Item $sourcefile $destination
 }
2个回答

7

好的,经过更多的研究我找到了一个解决方法:

$src = [Management.Automation.WildcardPattern]::Escape($sourcefile)
Copy-Item  $src $destination

如果括号在目录名称中,最好使用以下方式:$src = [Management.Automation.WildcardPattern]::Escape($sourcefile.FullName) - lvr123

2

$_ 是指当前被引用的参数;你在这里无法使用它,因为它在管道之外。

$source = "C:\Users\Tom\"
$destination ="C:\Users\Tom\Processed\"

if(-not(Test-Path $destination)){mkdir $destination | out-null}


ForEach ($sourcefile In $(Get-ChildItem $source | Where-Object { $_.Name -match "Daily_Reviews\[\d\d\d\d-\d\d\d\d\].journal" }))
{

  Copy-Item -literalpath $sourcefile $destination
 }

谢谢。我按照你建议的更改了,但是Copy-Item仍然出现完全相同的错误信息...很奇怪。我想知道是文件名中的括号引起的问题吗? - Slinky
这是因为文件名中有 "[" 和 "]"。当我移除左右括号时,它可以正常工作。但需要能够解析带有括号的文件。 - Slinky
2
方括号要求在调用 copy-item 时使用 -literalpath(一直想知道何时需要)。我已经修改了我的代码。 - alroc
@alroc 如果没有-LiteralPath,则会发生globbing,因此当文字文件或文件夹名称包含通配符时,您需要该选项。 - Ansgar Wiechers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接