PowerShell: Zeichen im Dateipfad als Index anstelle des Dateipfads als Index?

0

Ich versuche, ein Powershell-Skript zu schreiben, um eine inkrementelle differenzielle Sicherung meines Computers durchzuführen, habe jedoch Probleme damit, wie Powershell Dateipfadvariablen interpretiert.

$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)"

Die Ausgabe zeigt am Ende, dass C:\Program Files (x86)\Testes versucht hat, jeden Buchstaben dieses Pfads zu durchlaufen , anstatt ihn zu durchlaufen , als wäre es eine Datei. " und so weiter).

Ich habe versucht, den Variablen in der IF-Anweisung Anführungszeichen mit Escapezeichen hinzuzufügen, aber dies hatte keine Auswirkungen.

Das Outfile zeigt einen korrekten Dateipfad an, daher scheint es die korrekten Informationen zu erhalten. Was ich nicht verstehe, ist, warum das Array $C_P86Files_Namejedes Zeichen aus dem Pfad als Index im Array verwendet, anstatt jeden Filer von Get-ChildItem als Index im Array?

TheMohawkNinja
quelle

Antworten:

0

Wenn Sie eine (einzelne) Zeichenfolge als Array behandeln, wird ein Index als Zeichenzeiger verwendet, um zu verhindern, dass @()ein Array auch mit nur einem Element erzwungen wird.

Ihre Nutzung von:

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

Gibt einen String / ein Array von Strings zurück.

Es wäre viel einfacher, sie als Objekt zu behalten, durch das Sie iterieren könnten (und immer noch Zugriff auf ihre Eigenschaften haben).

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

Bin an dieser Ausgabe vorbeigekommen. Es scheint, als müsste eine andere Variable deklariert werden, damit das Array eine Zeile pro Index anstelle eines Zeichens enthält.

$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)"
TheMohawkNinja
quelle