Powershell:当具有字符[]的文件名时移动项目不起作用

时间:2013-02-12 22:20:18

标签: powershell filenames

关于使用PowerShell移动项目的快速问题:当文件名中包含[或]字符时,是否有人知道为什么以下脚本不起作用? (例如: file1 [VT] .txt

ls j:\ | foreach { 
  $itemName = $_.Name.Replace('.', ' ') 
  $destination = ls | where { $itemName -match $_.Name } | select -First 1 
  if ($destination -ne $null) {       
    mi $_.PSPath $destination.PSPath -Verbose -WhatIf  
  } 
}

例如,如果文件名为 file1.txt ,它会移动文件,但它会忽略名为 file1 [VT] .txt 的文件。我假设当它的名字上有chars [或]时,它没有找到文件的路径。有什么想法吗?

3 个答案:

答案 0 :(得分:5)

仅使用-literalpath

move-item参数
ls j:\ | foreach { 
  $itemName = $_.Name.Replace('.', ' ') 
  $destination = ls | where { $itemName -match $_.Name } | select -First 1 
  if( $destination -ne $null){       
   mi -literalpath $_.PSPath $destination.PSPath -Verbose -WhatIf  
  } 
}

答案 1 :(得分:0)

如果您更改此行,该怎么办:

mi $_.PSPath $destination.PSPath -Verbose -WhatIf

是这样的:

mi "$($_.PSPath)" "$($destination.PSPath)" -Verbose -WhatIf

答案 2 :(得分:0)

当您使用-match运算符时,它会将您要查找的模式(在您的示例中为$ _.Name)视为正则表达式。在.NET正则表达式中,[和]字符用于将字符与一组标记进行匹配。例如,正则表达式

{"file1[vt]"} 

将匹配字符串“file1v”和“file1t”。为了使用