FolderItem.Name确实返回没有文件扩展名的名称

时间:2014-11-14 15:06:10

标签: powershell windows-shell

  1. 创建文件,让我们说C:\randomname\file.txt
  2. 现在通过PowerShell运行以下脚本:

    $shell = new-object -com shell.application  
    $folder = $shell.NameSpace("C:\randomname")  
    $folder.Items() | where {$_.Name -eq "file.txt"}
    
  3. 观察不会产生任何意外的输出。

  4. 知道如何以合理的方式解决这种情况,而不是修改Windows设置吗?

    修改

    为了避免混淆,这只是我实际问题的精简版。我使用shell.application而不是Get-ChildItem的原因是我的randomname文件夹实际上是压缩的,即我有randomname.zip,我的实际代码如下所示:

    $shell = new-object -com shell.application  
    $zip = $shell.NameSpace("C:\randomname.zip")  
    $folder = $zip.Items() | where {$_.Name -eq "randomname"}
    $folder.GetFolder.Items() | where {$_.Name -eq "file.txt"}
    

2 个答案:

答案 0 :(得分:4)

FolderItem.Name返回值取决于特定Windows设置的值。请尝试以下方法:

  1. 打开控制面板,
  2. 文件夹选项,视图标签,
  3. 取消选中隐藏已知文件类型的扩展程序
  4. 重新运行脚本,您将看到预期的输出:

      

    应用程序:System .__ ComObject
      父:System .__ ComObject
      名称:file.txt
      路径:C:\ randomname \ file.txt
      ...

    我正在尝试编写一个可移植脚本,但在找到Name如何工作后,这似乎相当困难,因为我无法控制客户的Windows设置,而FullName没有FolderItem 1}}所以我无法找出可靠的出路。

    修改

    根据Nick Sedgewick的建议,.Path总是返回带扩展名的文件名,与.Name不同,我能够创建一个不依赖于Windows设置的工作解决方案,如下所示: / p>

    $shell = new-object -com shell.application  
    $folder = $shell.NameSpace("C:\")  
    $folder.Items() | where {(split-path $_.Path -leaf) -eq "file.txt"}
    

答案 1 :(得分:2)

命名空间项具有PATH属性,该属性返回文件的完整路径和文件名,并且始终包含文件扩展名,无论用户是否隐藏文件扩展名'是否设定。

所以,使用' Path'而不是'姓名'并编写一个函数来传递$ _。路径可以解压缩文件名部分,或者使用等效的LIKE运算符(如果powershell中有一个)