
Estoy tratando de aprender un poco sobre los scripts de PowerShell y he intentado desglosar lógicamente un script que incluye este fragmento.
$destFolders | Foreach-Object { Copy-Item -Path $Source -dest (Join-Path $_ $destFileName) }
Si estuviera escribiendo esto desde cero, creo que lo escribiría de la siguiente manera: ¿por qué me equivoco?
$destFolders | Foreach-Object { Copy-Item -Path $Source -dest ($_) }
Guión completo: - tenga en cuenta que $destfilename no está definido, posiblemente sea un error (?)
$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)}
Respuesta1
Esta línea contiene elementos, como $destFolders
y , que aparentemente forman parte de un guión completo $Source
. $destFileName
Sin conocerlos ni conocer su propósito, mi respuesta podría ser incorrecta.
sin embargo, elCopiar elementoEl comando tiene la capacidad de copiar un elemento y cambiarle el nombre también. Parece que esto es exactamente lo que hace la primera línea del guión. Su línea simplemente copia el artículo.
Respuesta2
Brevemente: Join-Path
le permite mantener la estructura de carpetas siempre que $destFileName
contenga información de directorios y archivos. (es decir, se parece a "somedirectory\myfile.txt"
, no myfile.txt
)
Entonces, el script copia archivos de C:\
la unidad a E:\
y D:\
.
Imagine que existe un archivo C:\myfile.txt
:
Copiar usando ambos fragmentos produce el mismo resultado: su fragmento dice "copiar de c:\ a d:\ y e:\ No voy a hacer nada con los nombres de archivos, así que manténgalos igual", el otro fragmento dice "copiar de c:\ a d:\myfile.txt y e:\myfile.txt. Te estoy diciendo explícitamente los nombres de los archivos".
Imagina que tienes un archivoC:\somedirectory\myfile.txt
Ahora hay una diferencia ya que
$_
se copiará unaD:\myfile.txt
yE:\myfile.txt
otra vez. Ignorará el hecho de que el archivo estaba contenido dentro de un directorio. UsarJoin-path $_ $destFileName
significará que el archivo se copia a D:\somedirectory\myfile.txtand E:\somedirectory\myfile.txt
Respuesta3
Puede ver una barra invertida duplicada C:\a\\a6ile0309.PxP
(error menor) y caracteres supuestamente no deseados en la salida original (error grave):
a6ile0309.PxP
↑ ↑ ↑
↓ ↓ ↓
afile0309.txt
Esto último se debe a especificadores de formato mal utilizados f
yt
(get-date).AddDays(-4).ToString('afileMMdd.txt')
# ↑ ↑ ↑
LeerFormato de fechas y horasyFormatear números y fechas usando el objeto CultureInfo:
f
Fecha y hora completas (fecha larga y hora corta)t
,%t
El primer carácter del designador AM/PMdefinido en AMDesignator o PMDesignator, si corresponde. Especifique "%t" si el patrón de formato no se combina con otros patrones de formato.
De hecho, f
en afile
los resultados hasta el último milisegundo (?) o tick (?), consulte la última nota a continuación. Sinceramente, no sé si se puede escapar, así que prueba con el siguiente fragmento 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
Producción:
PS D:\PShell> D:\PShell\SU\1187865.ps1
--- original ---
a6ile0309.PxP C:\a\\a6ile0309.PxP
--- use rather ---
afile0309.txt C:\a\afile0309.txt
tenga en cuentaeso
$filename = 'afile' + (get-date).AddDays(-4).ToString('MMdd') + '.txt'
podría escribirse como
$filename = '{0}{1}{2}' -f 'afile' , (get-date).AddDays(-4).ToString('MMdd') , '.txt'
y no se que notación es mejor o más correcta (Poder Shellish).
También tenga en cuentala diferencia:
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