Powershell:文件路径中的字符作为索引而不是文件路径作为索引?

Powershell:文件路径中的字符作为索引而不是文件路径作为索引?

我正在尝试编写一个 Powershell 脚本来对我的计算机进行增量差异备份,但是我对 Powershell 如何解释文件路径变量遇到了问题。

$C_P86Files_Name=Get-ChildItem -File -Path 'C:\Program Files (x86)\Test' -Recurse | foreach FullName
$B_P86Files_Name
$MovedFiles=0
$MovedBytes=0

#Out-File -FilePath 'C:\Program Files (x86)\Test\Test.txt' -InputObject $C_P86Files_Name

Get-ChildItem -File 'C:\Program Files (x86)\Test' -Recurse | foreach FullName

for ($i=0; $i -le ($C_P86Files_Name.Length-1); $i++)
{
    $B_P86Files_Name = $C_P86Files_Name[$i] -replace "^C", "B"

    Write-Host "Checking $($C_P86Files_Name[$i])"
    Write-Host "B drive directory: $($B_P86Files_Name[$i])"

    if(((ls $C_P86Files_Name[$i]).LastWriteTime -ne (ls $B_P86Files_Name[$i]).LastWriteTime) -or ((Test-Path $C_P86Files_Name[$i]) -and (!(Test-Path $B_P86Files_Name[$i]))))
    {
        Copy-Item $C_P86Files_Name[$i] -Destination $B_P86Files_Name[$i]
        $MovedFiles++;
        $MovedBytes+=(Get-Item $C_P86Files_Name[$i]).length

        Write-Host "Moved $($C_P86Files_Name[$i]) to $($B_P86Files_Name[$i])"
    }
}

Write-Host "Total data moved: $($MovedBytes)"

输出最终显示,C:\Program Files (x86)\Test它没有进行迭代,而是尝试迭代该路径的每个字母,就好像它是一个文件一样,然后相应地出错(例如,它检查“C”,然后检查“:”,然后检查“\”等等)。

我尝试在 IF 语句中的变量中添加转义引号,但这没有任何效果。

输出文件确实显示了正确的文件路径,因此它似乎获得了正确的信息。我不明白的是,为什么数组$C_P86Files_Name似乎使用路径中的每个字符作为数组中的索引,而不是使用 Get-ChildItem 中的每个文件作为数组中的索引?

答案1

如果您将(单个)字符串视为数组,它将使用索引作为字符指针,以防止@()强制使用只有 1 个元素的数组。

您对以下内容的使用:

Get-ChildItem -File 'C:\Program Files (x86)\Test' -Recurse | foreach FullName

返回一个字符串/一个字符串数组。

将它们保存为可以迭代的对象(并且仍然可以访问其属性)会容易得多

$C_P86Files = Get-ChildItem -File -Path 'C:\Program Files (x86)\Test' -Recurse
ForEach ($File in $C_P86Files){
    $B_FullName = $File.FullName -Replace '^C','B'
}

答案2

解决了这个问题。似乎需要声明另一个变量,以便数组每个索引占一行,而不是每个字符占一行。

$Files=Get-ChildItem -File -Path "C:\Program Files (x86)\Test" -Recurse | Select-Object -ExpandProperty FullName
$C_P86Files_Name
$B_P86Files_Name
$MovedFiles=0
$MovedBytes=0
Out-File -FilePath "C:\Program Files (x86)\Test\Test.txt" -InputObject $Files

'-----------------------------------------------------------------'

$C_P86Files_Name=$Files
$B_P86Files_Name=$Files

foreach($i in $C_P86Files_Name)
{
    $C_P86Files_Name[$i]
}

for ($i=0; $i -le ($C_P86Files_Name).Length; $i++)
{
    $B_P86Files_Name[$i]=$B_P86Files_Name[$i] -replace "^C", "B"

    Write-Host "C drive directory: $($C_P86Files_Name[$i])"
    Write-Host "B drive directory: $($B_P86Files_Name[$i])"

    if(((ls $C_P86Files_Name[$i]).LastWriteTime -ne (ls $B_P86Files_Name[$i]).LastWriteTime) -or ((Test-Path $C_P86Files_Name[$i]) -and (!(Test-Path $B_P86Files_Name[$i]))))
    {
        Copy-Item $C_P86Files_Name[$i] -Destination $B_P86Files_Name[$i]
        $MovedFiles++;
        $MovedBytes+=(Get-Item $C_P86Files_Name[$i]).length

        Write-Host "Moved $($C_P86Files_Name[$i]) to $($B_P86Files_Name[$i])"
    }
}

Write-Host "Total data moved: $($MovedBytes)"

相关内容