Invoke-Command传递PowerShell变量异常导致远程修改页面文件大小失败
Invoke-Command传递PowerShell变量异常导致远程修改页面文件大小失败
看起来你的问题核心是远程执行时$SetPF变量为null,所以后续设置InitialSize和MaximumSize才会报“找不到属性”以及“空值表达式无法调用方法”的错误。具体原因和修复方案如下:
问题根源分析
- 匹配逻辑错误:你用
where{$_.caption -like $Using:GetDrive}来过滤页面文件,但Win32_PageFileSetting的Caption属性值是完整的路径(比如P:\pagefile.sys),而$GetDrive只是单个盘符(比如P),直接用-like没有通配符的话完全匹配不上,导致$SetPF返回空值。 - 变量传递的冗余:其实你已经构造了完整的页面文件路径
$PagePath,直接用它来过滤会更准确,没必要再用盘符去模糊匹配。
修复后的完整脚本
#Get Page File Size and Path $MinSize= Read-Host "Enter minimum size in MB" $MaxSize = Read-Host "Enter maximum size in MB" $GetDrive = Read-Host "What drive do you want the Page File to exist" $PagePath = $GetDrive + ":\pagefile.sys" #Do the work Invoke-Command -ComputerName $PFServer -ScriptBlock{ # 禁用自动管理页面文件 $ComputerSystem = Get-WmiObject -ClassName Win32_ComputerSystem $ComputerSystem.AutomaticManagedPagefile = $false $ComputerSystem.Put() # 删除现有页面文件 $pf = Get-WmiObject -ClassName Win32_PageFileSetting if ($pf) { $pf.Delete() } # 创建新的页面文件(初始设为0,后续修改) Set-WmiInstance -Class Win32_PageFileSetting -Arguments @{ name = $using:PagePath InitialSize = 0 MaximumSize = 0 } -EnableAllPrivileges # 精准获取刚创建的页面文件对象 $SetPF = Get-WmiObject -ClassName Win32_PageFileSetting | Where-Object { $_.Name -eq $Using:PagePath } # 检查对象是否存在,再修改属性 if ($SetPF) { $SetPF.InitialSize = $Using:MinSize $SetPF.MaximumSize = $Using:MaxSize $SetPF.Put() Write-Host "页面文件设置已成功更新" } else { Write-Error "未能找到目标页面文件 $($Using:PagePath)" } }
关键改进点
- 精准过滤对象:用
$_.Name -eq $Using:PagePath代替模糊匹配,确保能准确获取到刚创建的页面文件对象。 - 增加空值检查:在删除现有页面文件和修改属性前都加了判断,避免因为空值导致报错。
- 补全完整流程:把本地脚本里的“禁用自动管理页面文件”和“删除现有页面文件”步骤也整合到远程脚本块里,确保流程完整(之前的远程脚本漏了这两步,可能导致设置不生效)。
额外建议
- 推荐使用CIM cmdlet代替WMI cmdlet(比如
Get-CimInstance、Set-CimInstance),因为WMI cmdlet已经被标记为过时,CIM在远程执行上更稳定且功能更丰富。 - 修改页面文件设置后,通常需要重启服务器才能生效,你可以在脚本末尾添加
Restart-Computer -Force(记得提前通知相关人员)。 - 确保执行脚本的账号拥有远程服务器的管理员权限,否则WMI操作会失败。
备注:内容来源于stack exchange,提问作者Dale
相关产品推荐
相关产品推荐

