【问题标题】:PowerShell Could Not Find Item - Path With Spaces IOExceptionPowerShell 找不到项目 - 带空格的路径 IOException
【发布时间】:2013-07-08 11:52:47
【问题描述】:
# --------------------------------------------------------- 
# ScriptingGamesBeginnerEvent8_PS1.ps1 
# ed wilson, msft 8/21/2009 
# PS1 version of HSG-08-19-09 http://bit.ly/1d8Rww 
# 
# --------------------------------------------------------- 
Param( 
 [string]$path = 'C:\', 
 [int]$first = 50 
)# end param 
# *** Function Here *** 

function Get-DirSize ($path){ 

  BEGIN {} 

  PROCESS{ 
    $size = 0 
    $folders = @() 

    foreach ($file in (Get-ChildItem $path -Force -ea SilentlyContinue)) { 
      if ($file.PSIsContainer) { 
        $subfolders = @(Get-DirSize $file.FullName) 
        $size += $subfolders[-1].Size 
        $folders += $subfolders 
      } else { 
        $size += $file.Length 
      } 
    } 

    $object = New-Object -TypeName PSObject 
    $object | Add-Member -MemberType NoteProperty -Name Folder -Value (Get-Item $path).fullname
    $object | Add-Member -MemberType NoteProperty -Name Size -Value $size 
    $folders += $object 
    Write-Output $folders 
  } 

  END {} 
} # end function Get-DirSize 

Function Get-FormattedNumber($size) 
{ 
  IF($size -ge 1GB) 
   { 
      "{0:n2}" -f  ($size / 1GB) + " GigaBytes" 
   } 
 ELSEIF($size -ge 1MB) 
    { 
      "{0:n2}" -f  ($size / 1MB) + " MegaBytes" 
    } 
 ELSE 
    { 
      "{0:n2}" -f  ($size / 1KB) + " KiloBytes" 
    } 
} #end function Get-FormattedNumber 

 # *** Entry Point to Script *** 

 if(-not(Test-Path -Path $path))  
   {  
     Write-Host -ForegroundColor red "Unable to locate $path"  
     Help $MyInvocation.InvocationName -full 
     exit  
   } 
 Get-DirSize -path $path |  
 Sort-Object -Property size -Descending |  
 Select-Object -Property folder, size -First $first | 
 Format-Table -Property Folder,  
  @{ Label="Size of Folder" ; Expression = {Get-FormattedNumber($_.size)} } 

所以我得到了这个脚本 http://gallery.technet.microsoft.com/scriptcenter/36bf0988-867f-45be-92c0-f9b24bd766fb#content

我一直在使用它并创建了一个批处理文件来帮助处理该文件的日志输出等。但是,我注意到其中带有空格的路径不会被读取。例如 ..Documents\我的音乐

    Get-Item : Could not find item C:\Users\MyUser\Documents\My Music.
    At C:\test.ps1:32 char:80
    +     $object | Add-Member -MemberType NoteProperty -Name Folder -Value (Get-It
    em <<<<  $path).fullname
+ CategoryInfo          : ObjectNotFound: (C:\Users\MyUser\Documents\My
Music:String) [Get-Item], IOException
 + FullyQualifiedErrorId : ItemNotFound,Microsoft.PowerShell.Commands.GetIt
emCommand

在代码的 TechNet 页面上,有人提出了问题,但没有给出解决方案。我不知道如何在这里解决它。我玩过 $path 参数,用 " " 或 ' ' 等包围它。

这是执行它的批处理文件的一部分:

  C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe -noe -command "&       'C:\test.ps1' -path "'C:\Users\MyUser\'""

【问题讨论】:

  • 直接在 powershell 中运行会得到什么?喜欢Get-DirSize "c:\Users\username\Saved Games"
  • 同样的事情 - 不被识别为 cmdlet 的名称...
  • @user2229804 “未识别为 cmdlet 的名称”如何与“找不到项目 C:\Users\MyUser\Documents\My Music.”相同??它们是两个不同的错误。您需要在控制台中加载函数 get-dirSize 才能调用它!!!
  • +1 表示@C.B 评论,或者只是从 powershell 控制台调用 c:\test\ScriptingGamesBeginnerEvent8_PS1.ps1 -path "you path with space"
  • 如果出现有关空格本身的问题,您可以尝试在路径周围加上 single 引号。 (添加,因为这个问题首先通过谷歌弹出)

标签: windows string powershell path


【解决方案1】:

在这里回答可能有点晚,但是,正如 Aaron 所说,这不是由于路径中的空格。

如果您阅读了Get-Item cmdlet 的文档,则有一个-Force 开关,它允许 cmdlet 获取其他方式无法访问的项目,例如隐藏项目。

此外,从您的代码看来,您并不希望将通配符模式传递给 cmdlet,因此您应该使用 (Get-Item $path).FullName 而不是

(Get-Item -force -LiteralPath $path).FullName

这应该可以解决这个问题。

【讨论】:

    【解决方案2】:

    正如 TheTrowser 在上面的评论中所建议的:如果将双引号替换为带空格的文件目录周围的单引号,则问题可能会得到解决。这就是为我解决的问题。

    【讨论】:

    • 对于空格"..."(双引号)和'...'(单引号)都有效。这些与引用样式之间的唯一区别是"..."expandable string,即它执行字符串插值,而'...' 不执行。
    • 对于空格,使用双引号会导致路径值在找到空格时被分解为单独的部分。使用单引号可以防止这种情况发生。我不确定这是否是您的评论的意思,但如果用户不小心,肯定会出现意想不到的差异。最好谨慎行事并始终使用单引号,这样用户就不必在他们的故障排除步骤中使用它。保持简单...
    • 不,这不是双引号的工作方式,并且 OP 的问题与引用无关,尽管他们认为它确实如此。 (是的,如果您有带空格的逐字值,最好使用单引号,既可以表示意图,也可以防止意外扩展;)
    【解决方案3】:

    这不是路径中的空格。如果是,错误将显示路径C:\Users\MyUser\Documents\My 找不到。 Get-ChildItemGet-Item 的行为......奇怪......对于某些文件/目录,返回您所看到的错误。这就是为什么Get-ChildItem 上有一个-ErrorAction SilentlyContinue 参数。我会将相同的内容添加到对Get-Item 的调用中,即更改

    (Get-Item $path).FullName
    

    (Get-Item $path -ErrorAction SilentlyContinue | Select-Object -ExpandProperty FullName
    

    甚至完全放弃对Get-Item 的调用:

    $path
    

    【讨论】:

    • 有没有办法修复它并让它采取相应的行动?我用两种方式替换它,但它仍然跳过例如目录。同时,我特意将我的图片设置为该用户下最大的文件夹。但除此之外 - 脚本现在看起来好多了,并且可以更精简地记录,谢谢。
    • 当您在正常的 PowerShell 提示符下对该目录运行 Get-Item 时是否收到错误?
    • 关于空格的观点很好,但Get-Item / Get-ChildItem 的行为在这里并不神秘:因为My Music 文件夹是一个隐藏文件夹(从技术上讲,它是系统为向后兼容而创建的隐藏 junction),这些 cmdlet 只能在同时指定 -Force 时检索它。也就是说,在目前的情况下,因为隐藏的连接点只是指向(非隐藏的)同级文件夹Music,用-ErrorAction SilentlyContinue / Ignore 忽略它可能更可取,但通常你会不想在计算目录大小时忽略隐藏项
    猜你喜欢
    • 2010-11-25
    • 2023-04-08
    • 1970-01-01
    • 2015-12-04
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    相关资源
    最近更新 更多