尝试访问一个服务器(按名称),并从需要删除的用户列表中搜索每个用户名的配置文件目录。经过多次尝试,仍然看到“$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.我在这里发布的第一个问题,所以我为任何意外或错误道歉!
1条答案
按热度按时间rxztt3cl1#
$UserPath = "\\dc1\P$\Profiles\$User" + ".V6"
使用
"..."
,即 * 可扩展 *(插值)字符串,意味着对变量$User
的引用被 * 立即 * 扩展,导致在变量$UserPath
中存储 * 静态 * 字符串;也就是说,您在此时 *“加入”了$DelUser
* 的值(由于$User
直到 later 才被定义,因此默认情况下扩展将导致 * 空字符串 *)。您需要做的是将您的
$UserPath = ...
赋值 * 移到foreach
循环 * 中,以便在每次迭代中 * 基于$User
的当前值重新计算"..."
字符串:注意事项:
".V6"
被直接折叠到"..."
字符串中--不需要单独附加+
。$user
变量的 * 属性 *-对于后者,您需要在$(...)
中使用enclosure-请参阅this answer以了解PowerShell字符串插值规则的摘要。-LiteralPath
比-Path
更安全。-Type Container
添加到Test-Path
调用中,以将测试限制为是否存在具有给定路径的 directory(而不是 file),尽管在这里可能没有必要。Write-Output
),省略了Write-Host
调用,但请注意,前者直接打印到 display,[1]而后者生成可以捕获的 data 输出。$user
),并且仅以大写字母开始 * 参数 * 变量(例如,param(...)
块中的$Path
)。请注意,有 * 多种 * 方法可以 * 执行字符串 * 模板化*,其中字符串扩展(插值)是 * 按需 * 在技术上逐字的字符串上执行的,如this answer所示。
然而,在当前的情况下,上述解决方案更简单。
[1]在PSv 5 +
Write-Host
中,写入information stream,其输出 * 可以 * 被捕获,但只能通过6>
。