2017-04-12 86 views
2

我最近遇到this post但它已經很老了,我想你們都想讓我開始一個新線程。搜索跨多個卷的文件

基本上,我正在爲部署WIM編寫PS腳本。我們將UNC路徑映射爲映射驅動器,然後運行批處理文件以搜索特定文件並根據其路徑創建變量。一旦變量到位,腳本將繼續 - 使用所述變量。批處理文件中的代碼示例如下所示:

FOR %%i IN (D E F G H I J K L M N O P Q R S T U V W X Y Z) DO IF EXIST %%i:\Win10.wim SET _WIMLocation=%%i: 

如何在PS中複製類似的內容?通常情況下,我會對驅動器號進行硬編碼,但如果其他人使用不同的字母映射驅動器,則腳本會中斷。所以,這就是爲什麼它會搜索驅動器號...

+0

不同於其他網站,所以寧願不如果事情回答你的問題已經創建一個新的線程。這就是說有一個單獨的問題有足夠的不同。例如你想保存一個新的變量,並且該數組沒有包含':',這有一個棘手的問題,因爲':'是用於範圍的。 – BenH

回答

4

這裏是做在PowerShell中的一種方式:

首先,你將與驅動器盤符的數組。通過包裝在引號或雙引號中,每個字母將是一個字符串,然後使用逗號分隔每個值,以便該變量將是一個字符串數組。

$Drives = "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" 

然後使用foreach循環,循環遍歷每個數組的值。

foreach ($Drive in $Drives) { 

然後使用if語句測試,以及if裏面,你可以測試一個文件夾或文件與Test-Path cmdlet的存在。 ${}是這樣的,我可以把變量放在引號內,並且它都是一個字符串,而不會讓解析器被:弄糊塗。或者,您可以構建連接路徑Test-Path $($Drive + ":\win10.wim")其中$()是首先要評估的子表達式,然後+運算符將連接兩個字符串。

if (Test-Path "${Drive}:\Win10.wim") { 

最後,你可以設置一個變量等於$Drive變量時if語句成功

 $WIMLocation = $Drive 
    } 
} 

這裏是什麼樣子乾脆:

$Drives = "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" 
foreach ($Drive in $Drives) { 
    if (Test-Path "${Drive}:\Win10.wim") { 
     $WIMLocation = $Drive 
    } 
} 
+0

我遇到了一個問題,其他人也可能會這樣......我有一個以「admin」打開的PS會話,並且沒有看到映射的驅動器。但是,當我正常打開一個新會話並運行相同的代碼時,它看到了路徑很好!這將在WinPE中運行,因爲我們正在部署WIM,所以我希望我們不會遇到這個問題。 – RKillcrazy

+0

[這是對此的修復](https://technet.microsoft.com/en-us/library/ee844140(v = ws.10).aspx) – BenH

2

如果你想找到您可以使用的系統上的所有活動FileSystem驅動器:

Get-PSDrive -PSProvider FileSystem 
2

這將複製您的批處理腳本。請注意,您不必在此硬編碼驅動器號。

$drives = Get-PSDrive | ? {$_.Provider.Name -eq "FileSystem" } 

foreach ($drive in $drives) { 

    $path = $drive.Name + ":\Win10.wim" 

    if (Test-Path $path) { 
     [Environment]::SetEnvironmentVariable("_WIMLocation", $drive.Name, "User") 
    } 
} 

可以替代

[Environment]::SetEnvironmentVariable("_WIMLocation", $drive, "User") 

$env:_WIMLocation = $drive.name 

,如果你不需要環境變量堅持

4

如果你想搜索只是本地卷,不網絡驅動器,您可以使用Get-Volume枚舉驅動器:

Get-Volume | Where-Object { 
    $_.DriveType -eq 'Fixed' -and 
    $_.DriveLetter 
} | Select-Object -Expand DriveLetter 

或(在較早的Windows/PowerShell的版本)查詢Win32_Volume WMI類:

Get-WmiObject -Class Win32_Volume | Where-Object { 
    $_.DriveType -eq 3 -and 
    $_.DriveLetter 
} | Select-Object -Expand DriveLetter