2014-11-14 117 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