Я пытаюсь немного узнать о скриптах PowerShell и пытаюсь логически разбить скрипт, который включает в себя этот фрагмент.

$destFolders | Foreach-Object { Copy-Item -Path $Source -dest (Join-Path $_ $destFileName) }

Если бы я писал это с нуля, я думаю, что написал бы это следующим образом - почему я не прав?

$destFolders | Foreach-Object { Copy-Item -Path $Source -dest ($_) }

Полный скрипт: - пожалуйста, обратите внимание, что $ destfilename не определено, возможно, ошибка (?)

$path = "C:\a\" 
$filename = (get-date).AddDays(-4).ToString('afileMMdd.txt')
$fileexisting = "$path\$filename"
$destfolders = "C:\b\", "C:\c\" 

while(!(Test-Path $fileexisting)) {Start-Sleep 5} 

$destfolders | 
    ForEach-Object {Copy-Item -Path $path\$filename -dest (Join-Path $_ $destfilename)} 

3 ответа3

2

Эта строка содержит элементы, такие как $destFolders , $Source и $destFileName , которые, по-видимому, являются частью полного сценария. Не зная их и их цели, мой ответ может быть неправильным.

Однако команда Copy-Item имеет возможность скопировать элемент и переименовать его тоже. Кажется, это именно то, что делает первая строка скрипта. Ваша строка просто копирует элемент.

2

Вкратце: Join-Path позволяет вам поддерживать структуру папок при условии, что $destFileName содержит информацию о каталогах и файлах. (то есть это выглядит как "somedirectory\myfile.txt" , а не myfile.txt)

Таким образом, скрипт копирует файлы с диска C:\ диск E:\ и D:\ .

Представьте, что существует файл C:\myfile.txt :

Копирование с использованием обоих фрагментов дает один и тот же результат: ваш фрагмент говорит: «копировать из c:\ в d:\ и e:\ Я ничего не делаю с именами файлов, поэтому просто оставьте их прежними», другой фрагмент говорит «скопировать из c:\ to d:\ myfile.txt и e:\ myfile.txt. Я явно говорю вам имена файлов "

Представьте, что у вас есть файл C:\somedirectory\myfile.txt

Теперь есть разница, так как $_ снова скопирует в D:\myfile.txt и E:\myfile.txt . Он будет игнорировать тот факт, что файл содержался в каталоге. Использование Join-path $_ $destFileName будет означать, что файл копируется в D:\somedirectory\myfile.txt and E:\somedirectory\myfile.txt

0

Вы можете увидеть двойную обратную косую черту в C:\a\\a6ile0309.PxP (небольшая ошибка) и предположительно нежелательные символы в исходном выводе (серьезная ошибка):

a6ile0309.PxP
 ↑        ↑ ↑
 ↓        ↓ ↓
afile0309.txt

Последнее вызвано неправильно используемыми спецификаторами формата f и t

(get-date).AddDays(-4).ToString('afileMMdd.txt')
#                                 ↑        ↑ ↑

Прочитайте форматирование даты и времени и форматирование чисел и дат с помощью объекта CultureInfo:

  • f Полная дата и время (длинная дата и короткое время)
  • t , %t Первый символ в обозначении AM/PM, определенный в AMDesignator или PMDesignator, если есть. Укажите «% t», если шаблон формата не объединен с другими шаблонами формата.

Фактически, f в afile приводит к длине миллисекунды (?) или отметьте (?), см. последнее примечание ниже. Честно говоря, я не знаю, можно ли его избежать, поэтому попробуйте следующий фрагмент кода:

'--- original ---'
$path = "C:\a\" 
$filename = (get-date).AddDays(-4).ToString('afileMMdd.txt')
$fileexisting = "$path\$filename"
$destfolders = "C:\b\", "C:\c\" 
Write-host $filename, $fileexisting -ForegroundColor Yellow

### next WHILE never ends
### while(!(Test-Path $fileexisting)) {Start-Sleep 5} 

'--- use rather ---'
$path = "C:\a\" 
$filename = 'afile' + (get-date).AddDays(-4).ToString('MMdd') + '.txt'
$fileexisting = Join-Path $path $filename
$destfolders = "C:\b\", "C:\c\" 
Write-host $filename, $fileexisting

Выход:

PS D:\PShell> D:\PShell\SU\1187865.ps1
--- original ---
a6ile0309.PxP C:\a\\a6ile0309.PxP
--- use rather ---
afile0309.txt C:\a\afile0309.txt

Обратите внимание, что

$filename = 'afile' + (get-date).AddDays(-4).ToString('MMdd') + '.txt'

может быть написано как

$filename = '{0}{1}{2}' -f 'afile' , (get-date).AddDays(-4).ToString('MMdd') , '.txt'

и я не знаю, какая запись лучше или правильнее (PowerShellish).

Также обратите внимание на разницу:

PS D:\PShell> (get-date).ToString("yyyy-MM-dd-HH.mm.ss.ffffff")  # six f
2017-03-13-22.23.35.897305

PS D:\PShell> (get-date).ToString("yyyy-MM-dd-HH.mm.ss.fffffff") # seven f
2017-03-13-22.30.08.4030682

PS D:\PShell> (get-date).ToString("f")
13 March 2017 22:23

PS D:\PShell> (get-date).ToString("ff")
20

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .