Powershell文件路径中出现非法字符错误

3
我正在尝试编写一个脚本,以查找并删除远程主机上的特定文件。为了做到这一点,脚本会在几个数组中循环遍历位置和文件名列表。其中一个需要执行此操作的文件是称为“101” "" "lyrics.vbs”的文件,但我无法找到一种方法来检测文件,而不给出错误消息“test-path : Illegal characters in path”,并参考““”标记。我已经搜索并尝试了将文件路径保存到文本文件中,并使用“get-item -literalpath”调用它的解决方案,但这也没有起作用。我还尝试在文件路径中的每个“”之前使用反引号“`”,但仍然得到相同的结果。用于此目的的代码段如下:
 $users | ForEach-Object {
#Creating an array file locations
$filelist = @("c$\Users\$($_.Name)\101__lyrics.vbs","c$\Users\$($_.Name)\101" "" "lyrics.vbs","c$\Users\$($_.Name)\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\101" "" "lyrics.vbs>")

   foreach ($file in $filelist)
    {
     $newfilepath = Join-Path "\\$computer\" "$file"
             if (test-path $newfilepath)
             {
             Write-Host -foregroundcolor Yellow "$newfilepath file exists"
                    try
                   {
                       Remove-Item $newfilepath -force -recurse -ErrorAction Stop
                   }
                   catch
                   {
                       Write-host -ForegroundColor red "Error while deleting $newfilepath on $computer.`n$($Error[0].Exception.Message)"

                     continue
                    }

                  Write-Host  -ForegroundColor green "$newfilepath file deleted`n"
              }

    }

非常感谢。
编辑:在每个"之前添加反引号并使用-literalpath时,我收到的错误消息是:
test-path : Illegal characters in path.
At .\Rb.ps1:126 char:22
+                  if (test-path -literalpath $newfilepath)
+                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (\\AAZAJCMW0459\...`" `"lyrics.vbs:String) [Test-Path], ArgumentException
    + FullyQualifiedErrorId : ItemExistsArgumentError,Microsoft.PowerShell.Commands.TestPathCommand

编辑你的问题,并使用反引号添加使用-literalpath和不使用-literalpath时收到的错误消息。 - Mike Sherrill 'Cat Recall'
仅为了澄清:文件名是 101" "" "lyrics.vbs,其中包括双引号空格双引号双引号空格双引号?我猜测是某个工具添加了额外的引号。目录列表显示文件夹中的内容是什么? - Richard
$filelist 中最后一个字符串末尾还有一个 > - Mathias R. Jessen
1
我已经更新了帖子,并添加了反引号和-literalpath后得到的错误消息。@richard,令人恼火的是101"" "" "lyrics.vbs是文件名,它是一个恶意文件。 - RJK
2个回答

0
$filelist = @("c$\Users\$($_.Name)\101__lyrics.vbs","c$\Users\$($_.Name)\101" "" "lyrics.vbs","c$\Users\$($_.Name)\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\101" "" "lyrics.vbs>")

当多个字符串连接在一起时,PowerShell会出现故障。更详细地说:

"c$\Users\$($_.Name)\101" "" "lyrics.vbs"

是语法错误。在双引号字符串中包含双引号,请使用反引号(`)进行转义:

"c$\Users\$($_.Name)\101`" `"`" `"lyrics.vbs"

1
OP说他使用了反引号,但可能使用不正确。尽管如此,在Windows文件名中,双引号是非法字符。我希望Windows无法创建这样的文件,无论使用什么工具。也许看起来像"的是Unicode相似字符或备用数据流的一部分。或者也许需要在这里调用8.3解决方法。 - Mike Sherrill 'Cat Recall'

0
在后面的评论中,您说它是一个恶意文件,因此可以推断出它的名称是经过精心设计的,以逃避正常的删除尝试。
事实上,在Windows的NTFS文件系统中,"不是合法的文件名字符,直接尝试定位这样的文件将会失败 - 任何转义技术都无济于事。

您也许可以通过枚举/通配符匹配获得其短8.3名称,并使用该名称来删除文件。

更新:楼主已经确认,通过 8.3 文件名的方式可以成功删除文件。


1
我终于成功获取了一个示例,并且使用短的8.3名称起作用了!非常感谢mklement0。 - RJK

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