powershell 从用户名列表中检查多个用户的网络“配置文件文件夹”是否存在

hs1rzwqc  于 2022-11-29  发布在  Shell
关注(0)|答案(1)|浏览(144)

尝试访问一个服务器(按名称),并从需要删除的用户列表中搜索每个用户名的配置文件目录。经过多次尝试,仍然看到“$User profile not found”的结果。即使我可以看到它清楚地位于目录中。当我为一个用户运行一个特定的测试时,它也会显示出来。例如:`

$DelUser = "user.name"
    $ProfileUser = "\\dc1\P$\Profiles\$DelUser" + ".V6"

    if ([System.IO.Directory]::Exists($ProfileUser)) {
    "......$DelUser..... EXISTS!"

    else {
    "$DelUser Path NOT FOUND!"
    }
    }

从源文件(txt)中提取(我也尝试过使用import-csv的csv文件,得到了相同的结果),我尝试用下面的代码遍历列表并搜索每个用户文件夹的存在。用户文件夹是user.name.V6的。下面是一个示例,其中包含一些注解的替代尝试。

$DelUser = Get-Content -Path C:\DelFolder\Delete-DC1-Users.txt
    $UserPath = "\\DC1\P$\Profiles\$User" + ".V6"

    foreach ($User in $DelUser) {
    if ([System.IO.Directory]::Exists($UserPath)) {
    Write-Host "$UserPath EXISTS"
    #if (Test-Path -Path $UserPath) {
    # if ($UserPath) {
    # Write-Host "$User Folder Exists" 
    }

    else {
    Write-Host "$User Folder DOES NOT EXIST" 
    }
    }

最多我会看到$User Folder DOES NOT EXIST,即使它实际上存在于服务器上。
我也尝试过使用Test-Path,但没有效果,正如上面注解掉的行所示。
谢谢!Pidoss.我在这里发布的第一个问题,所以我为任何意外或错误道歉!

rxztt3cl

rxztt3cl1#

$UserPath = "\\dc1\P$\Profiles\$User" + ".V6"
使用"...",即 * 可扩展 *(插值)字符串,意味着对变量$User的引用被 * 立即 * 扩展,导致在变量$UserPath中存储 * 静态 * 字符串;也就是说,您在此时 *“加入”了$DelUser * 的值(由于$User直到 later 才被定义,因此默认情况下扩展将导致 * 空字符串 *)。
您需要做的是将您的$UserPath = ...赋值 * 移到foreach循环 * 中,以便在每次迭代中 * 基于$User的当前值重新计算"..."字符串:

$delUser = Get-Content -LiteralPath C:\DelFolder\Delete-DC1-Users.txt

foreach ($user in $delUser) {
  # Determine the path *for the $user at hand*.
  $userPath = "\\DC1\P$\Profiles\$user.V6"
  if (Test-Path -LiteralPath $userPath) {
    "$userPath EXISTS"
  }
  else {
    "$user Folder DOES NOT EXIST" 
  }
}

注意事项:

  • 后缀".V6"被直接折叠到"..."字符串中--不需要单独附加+
  • 请注意,这样的后缀 * 不 * 被视为试图访问$user变量的 * 属性 *-对于后者,您需要在$(...)中使用enclosure-请参阅this answer以了解PowerShell字符串插值规则的摘要。
  • 当您知道您要处理的是文字(逐字)路径而不是wildcard expressions时,使用-LiteralPath-Path更安全。
  • 您可以将-Type Container添加到Test-Path调用中,以将测试限制为是否存在具有给定路径的 directory(而不是 file),尽管在这里可能没有必要。
  • 为了支持字符串的 implicit 输出(隐含的Write-Output),省略了Write-Host调用,但请注意,前者直接打印到 display,[1]而后者生成可以捕获的 data 输出。
  • 有关详细信息,请参阅this answer
  • 虽然没有强制执行,但值得遵守的 * 约定 * 是以 * 小写 * 字母开始常规变量的名称(例如,$user),并且仅以大写字母开始 * 参数 * 变量(例如,param(...)块中的$Path)。

请注意,有 * 多种 * 方法可以 * 执行字符串 * 模板化*,其中字符串扩展(插值)是 * 按需 * 在技术上逐字的字符串上执行的,如this answer所示。
然而,在当前的情况下,上述解决方案更简单。
[1]在PSv 5 + Write-Host中,写入information stream,其输出 * 可以 * 被捕获,但只能通过6>

相关问题