Invoke-Command 没有 return 来自我的 Get-ChildItem 的任何东西

Invoke-Command doesn't return anything from my Get-ChildItem

此脚本不会 return $file 参数。如果我在服务器本身没有 Invoke-Command 的情况下执行此操作,它确实会找到一个文件。

远程示例:

$file =Invoke-command -ComputerName $server -Credential $cred -ArgumentList $fileName -scriptblock{param($fileName)(Get-ChildItem -Recurse -Force "C:" -ErrorAction SilentlyContinue | Where-Object { ($_.PSIsContainer -eq $false) -and  ( $_.Name -eq $fileName) })}

write-host $file
write-host $file.PSPath

if($file -ne $null -or $file -ne ""){
        $path= $file.PSPath
    }
return $path

本地示例:

$file = Get-ChildItem -Recurse -Force "C:" -ErrorAction SilentlyContinue | Where-Object { ($_.PSIsContainer -eq $false) -and  ( $_.Name -eq $fileName) }
write-host $file
write-host $file.PSPath
if($file -ne $null -or $file -ne ""){
        $path= $file.PSPath
    }
return $path

我认为您的问题出在您的 Get-ChildItem 声明上。下面是一个例子来帮助你解决这个问题:

PS C:\Temp> Get-ChildItem 'C:'


    Directory: C:\Temp


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----           3/9/18   6:42 AM              0 file


PS C:\Temp> Get-ChildItem -Path 'C:\'


    Directory: C:\


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----          12/1/17   9:30 AM                PerfLogs
d-r---           3/7/18   2:52 PM                Program Files
d-r---          2/26/18   5:12 PM                Program Files (x86)
d-----           3/9/18   6:42 AM                Temp
d-r---          12/1/17  11:30 AM                Users
d-----           3/6/18  11:46 AM                Windows


PS C:\Temp>

此外,请记住,从 PowerShell 版本 3 开始,您可以使用 -Directory-File 而不是 Where-Object PSIsContainer 逻辑比较:

PS C:\Temp> Get-ChildItem -Path 'C:\' -File
PS C:\Temp> Get-ChildItem -Path 'C:\Temp\' -File


    Directory: C:\Temp


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----           3/9/18   6:42 AM              0 file


PS C:\Temp> Get-ChildItem -Path 'C:\Temp\' -Directory
PS C:\Temp> Get-ChildItem -Path 'C:\' -Directory


    Directory: C:\


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----          12/1/17   9:30 AM                PerfLogs
d-r---           3/7/18   2:52 PM                Program Files
d-r---          2/26/18   5:12 PM                Program Files (x86)
d-----           3/9/18   6:42 AM                Temp
d-r---          12/1/17  11:30 AM                Users
d-----           3/6/18  11:46 AM                Windows


PS C:\Temp> 

我认为这极大地提高了可读性,但如果您出于某种原因要在 PowerShellv2 中运行此脚本,它确实会牺牲向后兼容性。

TL;DR

我认为你需要这样做:

$file = Get-ChildItem `
    -Recurse `
    -Force `
    -Path 'C:\' `
    -File `
    -ErrorAction SilentlyContinue | 
        ?{$_.Name -eq $fileName}

我执行的一个简单测试:

PS C:\Temp> $fileName='file'
PS C:\Temp> $file = Get-ChildItem `
>>     -Recurse `
>>     -Force `
>>     -Path 'C:\' `
>>     -File `
>>     -ErrorAction SilentlyContinue |
>>         ?{$_.Name -eq $fileName}
PS C:\Temp> $file.PSPath
Microsoft.PowerShell.Core\FileSystem::C:\Temp\file
PS C:\Temp>

希望对您有所帮助!

编辑

既然我想到了,您也可以使用 -Filter 来过滤您的文件名:

PS C:\Temp> New-Item demo.csv


    Directory: C:\Temp


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----           3/9/18   7:12 AM              0 demo.csv


PS C:\Temp> Get-ChildItem -Path C:\Temp\ -Filter "$fileName"


    Directory: C:\Temp


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----           3/9/18   6:42 AM              0 file


PS C:\Temp> $fileName = '*.csv'
PS C:\Temp> Get-ChildItem -Path C:\Temp\ -Filter "$fileName"


    Directory: C:\Temp


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----           3/9/18   7:12 AM              0 demo.csv


PS C:\Temp>

这将消除您对 Where-Object 管道的需求。

还有...我刚注意到 mklement0 在上面的评论部分也指出了第二点。我的错。