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 在上面的评论部分也指出了第二点。我的错。
此脚本不会 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 在上面的评论部分也指出了第二点。我的错。