Script básico de Powershell

Script básico de Powershell

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 $destFoldersy , que aparentemente forman parte de un guión completo $Source. $destFileNameSin 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-Pathle permite mantener la estructura de carpetas siempre que $destFileNamecontenga 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á una D:\myfile.txty E:\myfile.txtotra vez. Ignorará el hecho de que el archivo estaba contenido dentro de un directorio. Usar Join-path $_ $destFileNamesignificará 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 fyt

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

LeerFormato de fechas y horasyFormatear números y fechas usando el objeto CultureInfo:

  • fFecha 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, fen afilelos 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

información relacionada