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


0

我试图编写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语句的变量中添加转义的引号,但这没有任何效果。

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

Answers:


0

如果将(单个)字符串视为数组,则它将使用索引作为char指针,以防止这种情况@()即使只有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'
}

0

克服了这个问题。似乎需要声明另一个变量才能使数组每个索引具有一行而不是一个字符。

$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)"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.