0

Мне очень интересно об этом, как это мне потребовалось некоторое время, но я не мог понять этоRemove-Item не работает, когда имя файла содержится в переменной

Во-первых, я побежал следующий сценарий, чтобы получить все Zip-файлы в директории

$entryList = New-Object System.Collections.ArrayList 

Get-ChildItem -Path "\\tools-backup.nas\Tools-Backup\FakeS3\Rollback\$serverName" -ErrorAction Stop | sort -Property "LastWriteTime" | ForEach-Object { 
    if($_.Name.Contains(".zip")) { 
      $entryList.Add($_.Name) | Out-Null 
     } 
    } 

он показал, как показано ниже:

2016-08-30_21-15-17_server-1.1.20558_client-1.1.20518 - Copy - Copy.zip 
2016-08-30_21-15-17_server-1.1.20558_client-1.1.20518 - Copy (2).zip 
2016-08-30_21-15-17_server-1.1.20558_client-1.1.20518 - Copy (3).zip 
2016-08-30_21-15-17_server-1.1.20558_client-1.1.20518 - Copy.zip 
2016-08-30_21-15-17_server-1.1.20558_client-1.1.20518 - Copy (6).zip 
2016-08-30_21-15-17_server-1.1.20558_client-1.1.20518 - Copy - Copy (2).zip 

Затем я попытался удалить первый (2016-08-30_21-15-17_server-1.1.20558_client-1.1. 20518 - Copy - Copy.zip) с удаленным элементом:

Remove-Item -Path "\\tools-backup.nas\Tools-Backup\FakeS3\Rollback\$serverName\$entryList[0]" -ErrorAction Stop 

Remove-Item : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters. 
At line:1 char:1 
+ Remove-Item -Path "\\tools-backup.nas\Tools-Backup\FakeS3\Rollback\$s ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : ReadError: (\\toolsbackup....lback\autopatch:String) [Remove-Item], PathTooLongException 
+ FullyQualifiedErrorId : DirIOError,Microsoft.PowerShell.Commands.RemoveItemCommand 

У меня слишком длинное исключение. Однако, если я ставлю имя файла в «Remove-Item» вместо того, чтобы передать его на $ entryList [0], он работал

Remove-Item -Path "\\tools-backup.nas\Tools-Backup\FakeS3\Rollback\$serverName\2016-08-30_21-15-17_server-1.1.20558_client-1.1.20518 - Copy (2).zip" -ErrorAction Stop 
+0

В стороне: вы можете просто сделать '$ entryList = Get-ChildItem -Path" \\ tools-backup.nas \ Tools-Backup \ FakeS3 \ Rollback \ $ serverName "* .zip -ErrorAction Stop | sort -Property «LastWriteTime» '. – mklement0

ответ

2

Ваш вопрос, используя «$ entryList [0]» в вашей строки в кавычках.

Выполнить этот код, чтобы увидеть, как это работает (или не работает) ...

$entryList = New-Object System.Collections.ArrayList 
$entryList.Add("This is an entry.") 

"Broken" 
# This is a string with: This is an entry.[0] 
Write-Output "This is a string with: $entryList[0]" 

"Fixed1" 
# This is a string with: This is an entry. 
Write-Output "This is a string with: $($entryList[0])" 

# or... 
"Fixed2" 
# This is a string with: This is an entry. 
$item = "This is a string with: {0}" -f $entryList[0] 
Write-Output $item 

Вы можете попробовать что-то вроде:

Remove-Item -Path "\\tools-backup.nas\Tools-Backup\FakeS3\Rollback\$serverName\$($entryList[0])" -ErrorAction Stop 

Кроме того, вместо того, чтобы использовать имя, вы может реорганизовать ваш код для использования FullName ...

$entryList.Add($_.FullName) 

Наслаждайтесь.

+0

Спасибо за ваше объяснение :) – user1888955

1

Kory Gill правильный. Когда вы ссылаетесь на строковый массив внутри строки, заключенной в двойные кавычки, вам нужно будет добавить $( перед именем массива и после ). Таким образом,

Write-Host "This is a $test[0]" 

Не даст вам желаемого результата. Ниже будет правильно получить строку в массиве и вставить в строку.

WRite-Host "This is a $($test[0])" 

Это одна из этих маленьких «ошибок», которые получили меня, когда я впервые начал работать в PowerShell.

+0

Спасибо за эту деталь :) – user1888955

+0

Просто помните, что если вы хотите, чтобы PowerShell сначала вычислил что-то, используйте подвыражение, отмеченное символом '' Something $ ($ RunThisFirst) ", а PowerShell вычисляет, что внутри скобки сначала. – user4317867

+0

@ user4317867 Спасибо, я написал это на моей заметке :) – user1888955