Powershell - Foreach,IF,Test-Path&驱动变量

时间:2016-05-06 17:10:36

标签: powershell

Hello Stackoverflow用户,

我是脚本和PowerShell的小伙伴。

我有以下脚本将主机上的所有驱动器号都转换为文本文件。我需要通过执行测试路径将正确的驱动器号写入变量。但它不起作用。我知道我很亲密,但无法让它发挥作用。 有谁知道如何修复脚本?

Get-WmiObject win32_logicaldisk -Filter "DriveType=3 AND DeviceID!='C:'" | Select DeviceID | Format-Table -HideTableHeaders > c:\DeviceID.txt -Force
$DeviceID = Get-Content C:\DeviceID.txt
$DeviceID | ForEach {$_.TrimEnd()} | ? {$_.trim() -ne '' } > c:\DeviceID.txt

$DeviceID = Get-Content C:\DeviceID.txt
$Path = "$_\Apps\NetprobeNT\"
$PathExists = Test-Path $Path

foreach ($DeviceID in $DeviceID)
{
If ($PathExists -eq $True)
{
$DeviceDrive = $DeviceID}
Else 
{
$DeviceDrive = "C:"}
}

我认为以下几行是问题

$Path = "$_\Apps\NetprobeNT\"

有关如何使其发挥作用的任何想法?

这与PowerShell - drive variable有关,以获取更多信息。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

正如你自己指出的那样,这条线存在问题:

$Path = "$_\Apps\NetprobeNT"

$_未在此范围内定义,因此生成的字符串变为"\Apps\NetprobeNT"

我会在Join-Path内使用Where-Object(其中$_将引用管道中的当前项目):

要查找文件夹所在的驱动器,您可以使用Where-Object

$CorrectDrive = $DeviceIDs |Where-Object {
    Test-Path $(Join-Path $_ "Apps\NetprobeNT") 
}
if(-not $CorrectDrive)
{
    $CorrectDrive = "C:"
}

话虽如此,您获取DeviceID的方法非常复杂 - 只需使用Select-Object -ExpandProperty来获取DeviceID值即可:

$DeviceIDs = Get-WmiObject Win32_LogicalDisk -Filter "DriveType=3 AND DeviceID!='C:'" |Select-Object -ExpandProperty DeviceID