我正在尝试编写一个 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)"