C:\randomname\file.txt
,现在通过PowerShell运行以下脚本:
$shell = new-object -com shell.application
$folder = $shell.NameSpace("C:\randomname")
$folder.Items() | where {$_.Name -eq "file.txt"}
观察不会产生任何意外的输出。
知道如何以合理的方式解决这种情况,而不是修改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 :(得分:4)
FolderItem.Name
返回值取决于特定Windows设置的值。请尝试以下方法:
重新运行脚本,您将看到预期的输出:
应用程序: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中有一个)