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

问题描述

我有一个简单的 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" -NoType@R_171_4045@ion 

如果我在本地机器上运行 (Get-ChildItem -recurse -path $folder1path).count cmd,它会返回正确的值。

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

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

解决方法

$folder1path 和 $folder2path 未在服务器 $server 上执行的 远程 PowerShell 会话上定义。在服务器上启动的远程会话不会从本地会话继承变量和环境,本地会话只能获取远程会话输出。实际上,您的脚本正在计算远程 PowerShell 会话的当前目录中的文件,因为变量 $folder1path 和 $folder2path 此处未定义,因此“空”。您必须将所需的局部变量作为命令参数传递给 @echo off FOR /D %%G in ("*") DO ( PUSHD "%%G" FOR /F "delims=" %%H in ('dir /a-d /b * ^|find /C /V ""') DO echo %%G %%H>>"..\count.txt" POPD ) 的脚本块。您可以通过使用 Ìnvoke-Command-ArgumentList 指令将 local 变量作为 Invoke-Command 的参数传递来做到这一点:

param