问题描述
我有一个简单的 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