【问题标题】:Why is this file count failing?为什么此文件计数失败?
【发布时间】:2021-04-19 15:08:34
【问题描述】:

我有一个简单的 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,它会返回正确的值。

问题在于,即使文件夹为空,scriptblock 部分也会始终返回不正确的值(28 和 38?)。

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

【问题讨论】:

  • Invoke-Command 脚本块中的变量必须传入或在脚本块中定义。我没有看到你在你的脚本块中传递了一些 $Vars。
  • @Lee_Dailey 你不认为这个问题值得回答为什么以及如何更正脚本吗?我同意这个在某种程度上是微不足道的,并且可能已经被问过了,但是,在我看来,理解为什么远程脚本不能有本地脚本变量有一些价值。
  • @Lee_Dailey 也许这个问题有点过于具体了。标题应更正为“为什么远程 PS 脚本无法按预期工作”。
  • @Lee_Dailey 作为参考,我还没有找到关于远程会话变量上下文的问题,即使过去存在关于如何正确将参数传递给远程 PS 会话的问题1,@987654322 @, 3.
  • @Lee_Dailey 找到与我认为匹配的:12。如果适合您,让您将其标记为重复。

标签: powershell invoke-command get-childitem


【解决方案1】:

$folder1path 和 $folder2path 未在服务器 $server 上执行的 remote PowerShell 会话中定义。在服务器上启动的远程会话不继承本地会话的变量和环境,本地会话只能获取远程会话输出。实际上,您的脚本正在计算远程 PowerShell 会话的 当前目录 中的文件,因为变量 $folder1path 和 $folder2path here 未定义,因此为“空”。您必须将所需的局部变量作为命令参数传递给Ì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 

【讨论】:

  • 啊哈!非常感谢!确实解决了!我没有考虑将这些传递给 REMOTE 节点。
  • @dbutts 我建议您使用更规范的内容来更正您的标题问题,例如“为什么远程 PS 脚本无法按预期工作”。您的问题可能已经在 cmets 中找到了答案。用规范/通用形式的问题搜索 SO 将在未来为您提供更好的 SO 结果。
猜你喜欢
  • 1970-01-01
  • 2014-11-23
  • 2014-01-06
  • 1970-01-01
  • 2012-07-25
  • 2019-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多