【问题标题】:PowerShell Copy-Item Method Fails - Brackets in FilenamePowerShell 复制项方法失败 - 文件名中的括号
【发布时间】:2013-04-10 15:21:44
【问题描述】:

我正在尝试使用 PowerShell (v.1) 仅复制与模式匹配的文件。文件命名约定是:

Daily_Reviews[0001-0871].journal
Daily_Reviews[1002-9887].journal
[...]

当我运行它时,“Copy-Item”方法抱怨:

无法检索 cmdlet 的动态参数。指定的通配符模式无效:Daily_Reviews[0001-0871].journal
+ 复制项目

错误是由于文件名中的“[”和“]”造成的。当我删除左右括号时,它按预期工作。但看起来 PowerShell 1 没有 -LiteralPath 标志,那么是否有另一种方法可以让 Copy-Item 在 PowerShell 1 中使用包含括号的文件名?

$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
 }

【问题讨论】:

    标签: windows powershell


    【解决方案1】:

    好吧,在研究了更多之后,我找到了一个解决方法:

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

    【讨论】:

      【解决方案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 得到了同样的抱怨......奇怪的东西。我想知道是不是文件名中的括号? ——
      • 这是因为文件名中的“[”和“]”。当我删除左右括号时,它按预期工作。需要能够解析带括号的文件
      • 方括号要求您在调用copy-item 时使用-literalpath(我一直想知道什么时候需要它)。我已经修改了我的代码。
      • @alroc 没有-LiteralPath globbing 发生,因此当文字文件或文件夹名称包含通配符时,您需要该选项。
      猜你喜欢
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多