为什么这个文件计数失败?

Why is this file count failing?

我有一个简单的 PS 脚本,它计算远程计算机上 2 个文件夹中的文件,然后导出到 CSV。

这些是实现它的代码(注意:所有变量,如 $server、$folder1path、$folder2path 都已定义且合法)

invoke-command -computername $servers -scriptblock {
$servername = hostname
$infoObject = New-Object PSObject

$folder1count=(Get-ChildItem -recurse  -path $folder1path).count
$folder2count =(Get-ChildItem -recurse  -path $folder2path).count

if ($folder1count -ne 0 -or $folder2count -ne 0) {

Add-Member -inputObject $infoObject -memberType NoteProperty -name "ServerName" -value $Servername
Add-Member -inputObject $infoObject -memberType NoteProperty -name "Folder1" -value $folder1count
Add-Member -inputObject $infoObject -memberType NoteProperty -name "Folder2" -value $folder2count

$infoObject}} | Select-Object * -ExcludeProperty PSComputerName, RunspaceId, PSShowComputerName | Export-Csv -path "C:\temp\Test_count_folder.csv" -NoTypeInformation 

如果我 运行 在本地计算机上 (Get-ChildItem -recurse -path $folder1path).count cmd 它 returns 正确的值。

问题是脚本块部分始终 returns 不正确的值(28 和 38?),即使文件夹是空的。

我错过了什么?它不会抛出错误,但会输出不正确的值。

$folder1path 和 $folder2path 未在服务器 $server 上执行的 remote PowerShell 会话中定义。在服务器上启动的远程会话不会从本地会话继承变量和环境,本地会话只能获取远程会话输出。实际上,您的脚本正在计算来自远程 PowerShell 会话的 当前目录 的文件,因为变量 $folder1path 和 $folder2path 在 这里 未定义,因此“空的”。您必须将所需的局部变量作为命令参数传递给 Ìnvoke-Command 的脚本块。您可以通过将 local 变量作为带有 -ArgumentListparam 指令的 Invoke-Command 的参数传递来实现:

$folder1path = "<path of folder 1>"
$folder2path = "<path of folder 2>"
invoke-command -computername $server -ArgumentList @($folder1path,$folder2path) -scriptblock {param($folder1path,$folder2path)
$servername = hostname
$infoObject = New-Object PSObject

$folder1count=(Get-ChildItem -recurse  -path $folder1path).count
$folder2count =(Get-ChildItem -recurse  -path $folder2path).count

if ($folder1count -ne 0 -or $folder2count -ne 0) {

Add-Member -inputObject $infoObject -memberType NoteProperty -name "ServerName" -value $Servername
Add-Member -inputObject $infoObject -memberType NoteProperty -name "Folder1" -value $folder1count
Add-Member -inputObject $infoObject -memberType NoteProperty -name "Folder2" -value $folder2count

$infoObject
}} | Select-Object * -ExcludeProperty PSComputerName, RunspaceId, PSShowComputerName | Export-Csv -path "C:\temp\Test_count_folder.csv" -NoTypeInformation