跨多个卷

时间:2017-04-12 14:34:49

标签: powershell powershell-v5.0

我最近遇到了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中复制类似的东西?通常情况下,我会对驱动器号进行硬编码,但如果其他人使用不同的字母映射驱动器,则脚本会中断。那么,这就是为什么它搜索驱动器号......

4 个答案:

答案 0 :(得分: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
   }
}

答案 1 :(得分: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

答案 2 :(得分:2)

如果要在系统上找到所有活动的FileSystem驱动器,可以使用:

Get-PSDrive -PSProvider FileSystem

答案 3 :(得分: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

如果您不需要环境变量来保持