2017-04-12 61 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