在尝试遍历约3k机器的集合以检查文件夹路径是否存在时,Test-Path(PowerShell)和'IF EXIST'(Batch)均返回假结果,表示在以下情况下远程路径不存在实际上,它确实存在。 我正在以与用户登录帐户不同的权威域凭据来运行PowerShell会话和ISE(和命令提示符)“作为管理员”。我已将-Credential参数提供给Test-Path,结果没有任何变化。
我正在运行Win10 v1709(10.0.16299.547)和PowerShell v5.1.16299.547。
在一次性机器名称上单独运行命令时,它们会起作用:
Powershell:
Test-Path "\\machineName\c$\Program Files (x86)\Common Files\Folder Name"
批次:
IF EXIST "\\machineName\c$\Program Files (x86)\Common Files\Folder Name" (echo True)
以上两个示例均按预期返回“ True”。
但是,在for / foreach循环中使用这些命令时,我只会得到'False'结果:(
PowerShell:
$Computers = Get-Content c:\logs\computers.txt
Write-Output "Checking $($Computers.count) Machines ..."
foreach ($Computer in $Computers)
{
if (Test-Path "\\$Computer\c$\Program Files (x86)\Common Files\Folder Name")
{
Write-Output "$($Computer): Folder Exists"
}
}
批次:
@echo off
for /f %%i in (C:\logs\computers.txt) do (
echo | SET /P nonewline=Checking %%i ...
IF EXIST "\\%%i\c$\Program Files (x86)\Common Files\Folder Name" (
echo Found
echo %%i >> c:\logs\folder_exists.txt
) ELSE (echo .)
)
pause
这两个示例均返回没有结果。
我从哪里开始寻找可能导致这种不良行为的原因?
是否有从我的域中应用的可能导致此结果的GPO?
答案 0 :(得分:0)
万一循环不起作用,请添加一些调试逻辑。目前,脚本在两种情况下无提示地失败:1)$Computers
为空2)test-path
遇到意外问题。
当在控制台上工作时,初始化一些变量并且从不分配脚本版本中的变量是一个常见错误。要捕获这种情况,请将set-strictmode
添加到脚本中,以便在使用未初始化的变量时会抱怨。
set-strictmode -Version 2.0
# Prohibits references to uninitialized variables
# and references to non-existent properties of an object.
# This eliminates common typos
if($Computers.Length -le 0) { # Is there data to process?
write-host '$Computers collection was empty!'
}
if($Computers.GetType().name -ne "Object[]") { # Is the collection an array anyway?
write-host '$Computers wasnt an array but: ' $Computers.GetType()
}
foreach ($Computer in $Computers)
{
if (Test-Path "\\$Computer\c$\Program Files (x86)\Common Files\Folder Name")
{
Write-Output "$($Computer): Folder Exists"
} else { # test-path fails. Write a warning and the path tried
write-host -nonewline "Fail: "
write-host "test-path \\$Computer\c$\Program Files (x86)\Common Files\Folder Name"
}
}
答案 1 :(得分:0)
批次分辨率:
在Notepad ++中打开了文本文件,并以某种方式将文件的编码设置为“ UCS-2 LE BOM”,而不是预期的“ UTF-8”。将编码设置为UTF-8并保存文件可以解决批处理文件问题。
多年前,我遇到了同样的问题,所以我有点尴尬,我在发布之前没有想到这一点。
PowerShell分辨率:
我最近开始使用SCCM模块,并且没有注意到我的脚本将我的位置设置为“ PS $ SCCMsiteCode:>” PSDrive。
只需在ISE控制台窗格中键入“ c:”,然后按Enter键,脚本便可以返回预期结果。
我认为当前位置不会阻止Write-Output写入控制台窗格。