测试for / foreach循环中是否存在远程UNC路径时,会得到不同的结果

时间:2018-08-01 17:38:06

标签: powershell batch-file foreach exists

在尝试遍历约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?

2 个答案:

答案 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写入控制台窗格。