2014-11-14 109 views
2
  1. 创建文件,让在C:\randomname\file.txt说,
  2. 现在通过PowerShell中运行以下脚本:FolderItem.Name确实没有扩展名返回

    $shell = new-object -com shell.application 
    $folder = $shell.NameSpace("C:\randomname") 
    $folder.Items() | where {$_.Name -eq "file.txt"} 
    
  3. 观察无法产生输出这是相当意外。

任何想法如何以合理的方式解决这种情况,而不是修改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"} 
+0

这与[tag:vba]有什么关系? – RubberDuck 2014-11-14 15:42:08

+0

@RubberDuck从我对[MSDN](http://msdn.microsoft.com/en-us/library/windows/desktop/bb773938(v = vs.85).aspx)的理解中,看起来像shell对象可以在PowerShell和VBA中都可以使用,因此行为可能是相同的。虽然这只是我的猜测,但如果我错了,请纠正我。 – 2014-11-14 15:45:24

+0

为什么你首先使用'Shell.Application'对象而不是'Get-ChildItem'? – 2014-11-14 15:46:14

回答

4

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

  1. 打开控制面板,
  2. 文件夹选项,查看选项卡,
  3. 取消选中隐藏已知文件类型

重新运行脚本,你会看到预期的输出:

应用:系统.__ ComObject
家长:系统.__ ComObject
名称:file.txt的
路径:C: \ randomname \ file.txt的
...

我试图写一个便携式的脚本,但AFTE [R找出如何Name作品,这似乎相当困难,因为我有过客户的Windows设置没有控制,没有什么比FullNameFolderItem所以我不能找出可靠的出路。

编辑:

基于从尼克塞奇威克的建议,即.Path总是返回文件名与扩展,不像.Name,我能创造出不依赖于Windows设置,看起来像这样一个工作的解决方法:

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

有什么理由不能使用'get-childitem'而不是shell? – Paul 2014-11-14 15:40:32

+0

@保罗的原因是,该文件夹实际上不是一个文件夹,而是一个'Get-ChildItem'可能无法工作的.zip文件。我会更新我的问题以说清楚。 – 2014-11-14 15:43:37

2

命名空间项目都有一个路径属性,它返回文件的完整路径和文件名,并始终包括文件扩展名,该用户是否具有“隐藏文件扩展名”设置与否。

所以不是“名称”,使用“路径”,要么写一个函数传递$ _。可以提取文件名部分的路径,或者使用与LIKE运算符(如果在PowerShell中有一个运算符)相同的路径

+0

感谢您的建议,它指出我的方向正确,我终于能够解决问题,请参阅上面我的答案的**编辑**部分。对不起,不接受你的,但它不提供工作解决方案。 – 2015-02-27 16:32:38