Powershell 数组失败,因为“Copy-Item:路径中的非法字符”。

Powershell array failing because of "Copy-Item : Illegal characters in path."

提问人:CmD 提问时间:6/10/2022 更新时间:6/10/2022 访问量:141

问:

我有一个特定的用例,我需要确定列表中的文件是否存在,如果存在,请将它们复制到保留相关文件结构的单独位置。我需要将目标列表保留在同一个脚本中。

我相信我的问题与由于驱动器号的“:”而无法正确解析内部数据的方式有关,但我不确定如何解决这个问题。 从下面的代码中可以看出,我试图通过忽略驱动器号并在 Copy-Item 期间附加它来解决这个问题,但它似乎也不起作用。(例如:C:\folder\file 在列表中变为 \folder\file。

我创建了测试目录,只是为了帮助显示问题,我想抓取的文件/文件夹示例(纯粹用于测试,实际文件是多个位置/文件类型)。

- test_dir_cmd
    - folder
        - folder1
            * file2.db
            * file3.json
        * file2.txt
        * file3.js
    - folder2
        * file.bak
        * file.db
        * file.txt
    * temp.dat

此方法适用于文件夹及其内容,但不适用于特定文件或通配符。

"\USERS\$USER\AppData\Local\test_dir_cmd\folder\folder1",
"\USERS\$USER\AppData\Local\test_dir_cmd\folder\*.txt",
"\USERS\$USER\AppData\Local\test_dir_cmd\*\file.db",
"\USERS\$USER\AppData\Local\test_dir_cmd\temp.dat”

这是一个示例,说明我需要获取的文件列表是如何呈现的,我需要使用。

给出的错误:

Copy-Item : Illegal characters in path.
At F:\P2P.ps1:37 char:1
+ Copy-Item "C:$path" -Destination "$triage_location\$path" -Force -Rec ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Copy-Item], ArgumentException
    + FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.CopyItem 
   Command

用于上下文的完整脚本:

$triage_location = "C:\temp\output\Triage\c"

ForEach-Object { #Looping through C:\Users to find folders that begin with numbers only and add to an array called $users
    $users = @(Get-ChildItem -Path 'C:\Users'| Where-Object { $_.Name -match '^c+' } | Select -ExpandProperty Name)
}
Write-Host "users = $users"
write-host ""

$path_array = foreach ($user in $users) { # Loop through contents of users array and add each user to known locations

@(
    "\USERS\$USER\AppData\Local\test_dir_cmd\folder\folder1",
    "\USERS\$USER\AppData\Local\test_dir_cmd\folder\*.txt",
    "\USERS\$USER\AppData\Local\test_dir_cmd\*\file.db",
    "\USERS\$USER\AppData\Local\test_dir_cmd\temp.dat”
  )
 }

Write-Host "path_array = $path_array"
write-host ""

foreach ($path in $path_array) {
$a = Test-Path -Path "C:$path" # Creating variable called 'a' and setting it to Test-path value which is either True/False

if ($a -eq "True") # Test if browser location paths exist or not. If a returns True/False...
{
Write-Host "C:$path exists"
    if(!(Test-Path -Path "$triage_location"))
    {
        New-Item -ItemType Directory -Path $triage_location
    }

Copy-Item "C:$path" -Destination "$triage_location\$path" -Force -Recurse

}

else
{Write-Host "C:$path doesn't exist"}

}

if(Test-Path -Path "C:\temp\output\Triage")
    {
        Write-Host ""
        Write-Host "Creating relevant .ZIP"
        Compress-Archive -Path 'C:\temp\output\Triage' -DestinationPath 'C:\temp\output\P2P.zip' -Force # put zip in documents
    }

任何关于我如何解决这个问题的帮助和建议将不胜感激!

数组 powershell 文件位置

评论


答:

0赞 TheMadTechnician 6/10/2022 #1

问题是你没有很好地加入路径。您可以这样做:

-Destination "$triage_location\$path"

在这一点上是并且是 .你只需使用字符串扩展来创建路径,但由于以 a 开头,并且将其包含在字符串中,因此您的字符串如下所示:$triage_locationC:\temp\output\Triage\c$path\USERS\TMTech\AppData\Local\test_dir_cmd\folder\folder1$path\

"C:\temp\output\Triage\c\\USERS\TMTech\AppData\Local\test_dir_cmd\folder\folder1"

请改用:Join-Path

Copy-Item (Join-Path 'C:\' $path) -Destination (Join-Path $triage_location $path) -Force -Recurse

评论

0赞 CmD 6/11/2022
所以我尝试了这个,但我得到了以下错误: 以及: 这很奇怪,因为文件存在在那里,它甚至这么说。Copy-Item : Illegal characters in path. At F:\P2P.ps1:39 char:1 + Copy-Item (Join-Path 'C:' $path) -Destination (Join-Path $triage_loca ...C:\USERS\cmd\AppData\Local\test_dir_cmd\temp.dat exists Copy-Item : Could not find a part of the path 'C:\temp\output\Triage\c\USERS\cmd\AppData\Local\test_dir_cmd\temp.dat'. At F:\P2P.ps1:39 char:1 + Copy-Item (Join-Path 'C:' $path) -Destination (Join-Path $triage_loca ...