Get-ChildItem:路径中有非法字符

3
我正在尝试登录多个服务器并从这些服务器获取文件列表。
以下是我的脚本:
$ServerName=Get-content "D:\HOMEWARE\BLRMorningCheck\Jerry\servername.txt"
foreach ($server in $ServerName)
{
  $server_host=echo $server | %{$data = $_.split(";"); Write-Output "$($data[0])"}
  $Targetfolder=echo $server | %{$data = $_.split(";"); Write-Output "$($data[1])"}

  $Extension =@("*.log","*.txt*")

  $Files = Get-Childitem $TargetFolder -Include $Extension -Recurse 

  echo $Files
}

当我运行调试模式时,我发现它实际上并没有选择文件。
错误:
Get-ChildItem : Illegal characters in path.
At D:\HOMEWARE\BLRMorningCheck\Jerry\test.ps1:14 char:23
+ $Files = Get-Childitem <<<<  $TargetFolder -Include $Extension -Recurse 
    + CategoryInfo          : InvalidArgument: (D:\HOMEWARE\BLR...ck\Jerry\Check":String) [Get-ChildItem], ArgumentException
    + FullyQualifiedErrorId : ItemExistsArgumentError,Microsoft.PowerShell.Commands.GetChildItemCommand

Get-ChildItem : Cannot find path 'D:\HOMEWARE\BLRMorningCheck\Jerry\"\srvparrtfh01\d$\HOMEWARE\BLRMorningCheck\Jerry\Check"' because it does not exist.
At D:\HOMEWARE\BLRMorningCheck\Jerry\test.ps1:14 char:23
+ $Files = Get-Childitem <<<<  $TargetFolder -Include $Extension -Recurse 
    + CategoryInfo          : ObjectNotFound: (D:\HOMEWARE\BLR...ck\Jerry\Check":String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

注意:如果我手动运行它,例如。
$Files = Get-Childitem \\servername\d$\HOMEWARE\BLRMorningCheck\Jerry\Check -Include "*.log","*.txt*" -Recurse

我得到了输出。

2
你需要解决这个问题:无法找到路径 'D:\HOMEWARE\BLRMorningCheck\Jerry\"\srvparrtfh01\d$\HOMEWARE\BLRMorningCheck\Jerry\Check"',因为它不存在。 你是否输出了 $TargetFolder 变量?从这个错误信息来看,它似乎是不正确的。 - arco444
1
你好,acro444,是的,我能够回显目标文件夹。回显 $server_host $TargetfolderSRVPAREMSH04 "\SRVPAREMSH04\d$\Homeware\LogManagement\Jerry_sam" - samjerry
1
你需要从$Targetfolder中删除引号。 - user4003407
1
$Targetfolder=$Targetfolder.Trim('"') - user4003407
最好更新你的问题并提供输入数据的样本。没有看到它很难说什么。 - user4003407
显示剩余3条评论
2个回答

3

正如@arco444和@PetSerAl在评论中提到的:您的路径字符串具有前导/尾随双引号,这些是路径中无效的字符。您需要将它们删除以使路径按预期工作:

$Files = Get-Childitem ($TargetFolder -replace '^"|"$') -Include $Extension -Recurse

当然,由于您的输入文件似乎是某种CSV格式,因此您可以使用Import-Csv而不是使用Get-Content读取文件并手动拆分字段。这将已经处理好导入文件中的双引号。

$filename  = 'D:\HOMEWARE\BLRMorningCheck\Jerry\servername.txt'
$extension = '*.log', '*.txt*'

Import-Csv $filename -Delimiter ';' -Header 'ComputerName', 'TargetFolder' | % {
  Get-Childitem $_.TargetFolder -Include $extension -Recurse 
}

0

这是一个绝对的噩梦,当有多个路径时,get-childitem无法接受字符串变量。

Get-ChildItem -Path "\server1\c$\temp", "\server1\d$\temp" -File -recurse # 可以工作

$path = '"\server1\c$\temp", "\server1\d$\temp"'; Get-ChildItem -Path "\server1\c$\temp", "\server1\d$\temp" -File -recurse # 不能找到路径

$path = "'"\server1\c$\temp", "\server1\d$\temp'""; Get-ChildItem -Path "\server1\c$\temp", "\server1\d$\temp" -File -recurse # 失败,并出现非法字符消息(后撤)

任何具有多个路径的字符串都会失败,但如下所示使用+=的数组将起作用。

$servers = @("server1", "server2");
$partialPaths = @("\c$\temp\", "\d$\temp\");
foreach ($server in $servers)
    {
        $paths = @();
        foreach ($partialPath in $partialPaths)
        {
            $paths += "\\" + $server + $partialPath;
        }
    }   
Get-ChildItem -Path $paths -File -recurse;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接