2015-11-20 3 views
1

Итак, сценарий имеет длину более 500 строк, поэтому я воздержусь от публикации всего. Тем не менее, я сузил проблему до одной строки.Splatting with Move-Item дает ошибку

Если я использую нижеследующую строку кода, все работает так, как ожидалось.

Move-Item -Path $path -Include *.txt,*.doc,*.pdf -Destination $dest -Force 

Но когда я изменить его использовать splatting, он дает мне ошибку

$downloadDir = "G:\Downloads" 
$dest = "G:\Test\" 
$editList = Get-ChildItem -LiteralPath "$downloadDir" -include "[" -File | ForEach-Object -Process {Rename-item -LiteralPath $_.FullName -NewName ($_.Name -replace "[][]"," ") -ErrorAction SilentlyContinue} 
$mainList = Get-ChildItem -Path "$downloadDir" -File | Select-Object Name 

ForEach ($list in $mainList) { 
    $item = $list.Name 
    $path = "$downloadDir\*" 
    $opts = @{ 
     Path = $path; 
     Include = '*.txt,*.doc,*.pdf'; 
     Force = $true; 
     Destination = $dest 
    } 
    Move-Item @opts 
} 

Move-Item : Cannot move item because the item at 'G:\Downloads\test.txt' does not exist. 

Я чувствую, что я, вероятно, отсутствует что-то очень простой, но я не знаю достаточно о хэш-таблицы/пока не заметили ошибку.

Любые идеи?

EDIT: Для уточнения, G: \ Downloads \ test.txt происходит из $ path, который генерируется с помощью Get-ChildItem.

Я буквально делаю прямую замену двух версий кода (Splatting/Non-splatting).

EDIT 2: Добавлены все части сценария, относящиеся к этому Move-Item

EDIT 3: Получил эту работу, используя двойные кавычки для "Include" линии:

Include = "*.txt","*.doc","*.pdf"; 
+0

Какой аргумент 'G: \ Downloads \ test.txt'? И это терпит неудачу, если вы сразу же замените одну строку с помощью функции splatted в скрипте? –

+0

Извините, должно было это объяснить. В основном «G: \ Downloads \ test.txt» поступает из $ path, который создается до этой части скрипта. По сути, это приложение Get-ChildItem запускается в G: \ Downloads. Да. Эта ошибка появляется при свопинге. – Balthier

+1

Не уверен, что это проблема, но аргумент '-Include' принимает массив строк, а не строку, содержащую элементы, разделенные запятыми. Попробуйте 'Include = '* .txt', '*. Doc', '*. Pdf';' –

ответ

0

Измените ваш Включают от:

Include = '*.txt,*.doc,*.pdf'; 

в

Include = "*.txt","*.doc","*.pdf"; 

Инструкция Path может быть сложной.

Например

get-childitem c:\temp -include *.txt 

не будет работать, в то время как

get-childitem c:\temp\* -include *.txt 

будет работать, если у вас есть какие-либо файлы с расширением .txt в C: \ TEMP

Это глупо, но это, как это с некоторыми из этих командлетов.

+1

Пока одинарные кавычки не работали, это заставило меня попробовать использовать двойные кавычки, которые действительно работали, поэтому спасибо за предложение! – Balthier

+0

Huh! Я думал, что это сработало для меня на v5, когда я его протестировал. Итак, * была проблема? –

+0

Я уже использовал \ *, но когда я сменил «Include» на 'Include =" * .txt "," *. Doc "," *. Pdf ";', он начал работать. Кроме того, в настоящее время я использую v4, так что, возможно, есть небольшая разница в том, как он обрабатывается? – Balthier