跨多个卷搜索文件
Search for a file, across multiple volumes
我最近遇到了 ,但它已经过时了,我想你们都希望我开始一个新话题。
基本上,我正在编写 PS 脚本来部署 WIM。我们 将 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 中复制类似的内容?通常,我会对驱动器盘符进行硬编码,但如果其他人用不同的盘符映射驱动器,脚本就会中断。所以,这就是它搜索驱动器号的原因...
这是在 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") {
最后,当 if
语句成功时,您可以将变量设置为等于 $Drive
变量
$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
}
}
如果您想查找系统上所有活动的文件系统驱动器,您可以使用:
Get-PSDrive -PSProvider FileSystem
这将复制您的批处理脚本。请注意,您不必在此处对驱动器号进行硬编码。
$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
如果不需要环境变量持久化
如果您只想搜索本地卷,而不是网络驱动器,您可以使用 Get-Volume
:
枚举驱动器
Get-Volume | Where-Object {
$_.DriveType -eq 'Fixed' -and
$_.DriveLetter
} | Select-Object -Expand DriveLetter
或(在较旧的 Windows/PowerShell 版本上)查询 Win32_Volume
WMI class:
Get-WmiObject -Class Win32_Volume | Where-Object {
$_.DriveType -eq 3 -and
$_.DriveLetter
} | Select-Object -Expand DriveLetter
我最近遇到了
基本上,我正在编写 PS 脚本来部署 WIM。我们 将 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 中复制类似的内容?通常,我会对驱动器盘符进行硬编码,但如果其他人用不同的盘符映射驱动器,脚本就会中断。所以,这就是它搜索驱动器号的原因...
这是在 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") {
最后,当 if
语句成功时,您可以将变量设置为等于 $Drive
变量
$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
}
}
如果您想查找系统上所有活动的文件系统驱动器,您可以使用:
Get-PSDrive -PSProvider FileSystem
这将复制您的批处理脚本。请注意,您不必在此处对驱动器号进行硬编码。
$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
如果不需要环境变量持久化
如果您只想搜索本地卷,而不是网络驱动器,您可以使用 Get-Volume
:
Get-Volume | Where-Object {
$_.DriveType -eq 'Fixed' -and
$_.DriveLetter
} | Select-Object -Expand DriveLetter
或(在较旧的 Windows/PowerShell 版本上)查询 Win32_Volume
WMI class:
Get-WmiObject -Class Win32_Volume | Where-Object {
$_.DriveType -eq 3 -and
$_.DriveLetter
} | Select-Object -Expand DriveLetter