提问人:CmD 提问时间:6/10/2022 更新时间:6/10/2022 访问量:141
Powershell 数组失败,因为“Copy-Item:路径中的非法字符”。
Powershell array failing because of "Copy-Item : Illegal characters in path."
问:
我有一个特定的用例,我需要确定列表中的文件是否存在,如果存在,请将它们复制到保留相关文件结构的单独位置。我需要将目标列表保留在同一个脚本中。
我相信我的问题与由于驱动器号的“:”而无法正确解析内部数据的方式有关,但我不确定如何解决这个问题。 从下面的代码中可以看出,我试图通过忽略驱动器号并在 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
}
任何关于我如何解决这个问题的帮助和建议将不胜感激!
答:
0赞
TheMadTechnician
6/10/2022
#1
问题是你没有很好地加入路径。您可以这样做:
-Destination "$triage_location\$path"
在这一点上是并且是 .你只需使用字符串扩展来创建路径,但由于以 a 开头,并且将其包含在字符串中,因此您的字符串如下所示:$triage_location
C:\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 ...
上一个:可变存储位置 - 最佳实践?
评论