![](/img/trans.png)
[英]Powershell using Invoke-Command and Get-Childitem not delivering content
[英]Invoke-Command doesn't return anything from my Get-ChildItem
该脚本不向$ 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中运行此脚本,则确实牺牲了向后兼容性。
我认为您需要这样做:
$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在上面的注释部分中也指出了第二点。 我的错。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.