
Estou tentando aprender um pouco sobre os scripts do PowerShell e tentando dividir logicamente um script que inclui esse trecho.
$destFolders | Foreach-Object { Copy-Item -Path $Source -dest (Join-Path $_ $destFileName) }
Se eu estivesse escrevendo isso do zero, acho que escreveria da seguinte maneira - por que estou errado?
$destFolders | Foreach-Object { Copy-Item -Path $Source -dest ($_) }
Roteiro Completo: - observe que $destfilename não está definido, possivelmente com erro (?)
$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)}
Responder1
Esta linha contém elementos, como $destFolders
, $Source
e $destFileName
, que aparentemente fazem parte de um script completo. Sem conhecê-los e seu propósito, minha resposta poderia estar errada.
No entanto, oCopiar ItemO comando tem a capacidade de copiar um item e renomeá-lo também. Parece que é exatamente isso que a primeira linha do script está fazendo. Sua linha apenas copia o item.
Responder2
Brevemente: Join-Path
permite manter a estrutura de pastas, desde que $destFileName
contenha informações de diretório e arquivo. (ou seja, parece algo como "somedirectory\myfile.txt"
, não myfile.txt
)
Portanto, o script está copiando arquivos da C:\
unidade para E:\
e D:\
.
Imagine que existe um arquivo C:\myfile.txt
:
Copiar usando os dois trechos produz o mesmo resultado: seu trecho diz "copiar de c:\ para d:\ e e:\ Não estou fazendo nada com os nomes dos arquivos, então apenas mantenha-os iguais", o outro trecho diz "copiar de c:\ para d:\myfile.txt e e:\myfile.txt Estou informando explicitamente os nomes dos arquivos"
Imagine que você tem um arquivoC:\somedirectory\myfile.txt
Agora há uma diferença, pois
$_
copiará de novoD:\myfile.txt
eE:\myfile.txt
de novo. Ele irá ignorar o fato de o arquivo estar contido em um diretório. UsarJoin-path $_ $destFileName
significará que o arquivo será copiado para D:\somedirectory\myfile.txtand E:\somedirectory\myfile.txt
Responder3
Você pode ver uma barra invertida dupla C:\a\\a6ile0309.PxP
(pequeno erro) e caracteres supostamente indesejados na saída original (erro grave):
a6ile0309.PxP
↑ ↑ ↑
↓ ↓ ↓
afile0309.txt
Este último é causado por especificadores de formato mal utilizados f
et
(get-date).AddDays(-4).ToString('afileMMdd.txt')
# ↑ ↑ ↑
LerFormatando datas e horaseFormatando números e datas usando o objeto CultureInfo:
f
Data e hora completas (data longa e hora curta)t
,%t
O primeiro caractere no designador AM/PMdefinido em AMDesignator ou PMDesignator, se houver. Especifique "%t" se o padrão de formato não for combinado com outros padrões de formato.
Na verdade, f
nos afile
resultados até o último milissegundo(?) ou tick(?), veja a última nota abaixo. Honestamente, não sei se é possível escapar, então tente o seguinte trecho de código:
'--- 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
Saída:
PS D:\PShell> D:\PShell\SU\1187865.ps1
--- original ---
a6ile0309.PxP C:\a\\a6ile0309.PxP
--- use rather ---
afile0309.txt C:\a\afile0309.txt
Observeque
$filename = 'afile' + (get-date).AddDays(-4).ToString('MMdd') + '.txt'
poderia ser escrito como
$filename = '{0}{1}{2}' -f 'afile' , (get-date).AddDays(-4).ToString('MMdd') , '.txt'
e não sei qual notação é melhor ou mais correta (PowerShell).
Observe tambéma diferença:
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