Grundlegendes Powershell-Skript

Grundlegendes Powershell-Skript

Ich versuche, etwas über PowerShell-Skripte zu lernen und habe versucht, ein Skript, das diesen Snippet enthält, logisch aufzuschlüsseln.

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

Wenn ich dies von Grund auf neu schreiben würde, würde ich es wahrscheinlich wie folgt schreiben – warum liege ich falsch?

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

Vollständiges Skript: - bitte beachten Sie, dass $destfilename nicht definiert ist, möglicherweise ein Fehler(?)

$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)} 

Antwort1

Diese Zeile enthält Elemente wie $destFolders, $Sourceund $destFileName, die scheinbar Teil eines vollständigen Skripts sind. Ohne sie und ihren Zweck zu kennen, könnte meine Antwort falsch sein.

AllerdingsKopiere ArtikelDer Befehl kann ein Element kopieren und auch umbenennen. Es scheint, dass die erste Skriptzeile genau das tut. Ihre Zeile kopiert einfach das Element.

Antwort2

Knapp: Join-Pathermöglicht Ihnen die Verwaltung der Ordnerstruktur, sofern diese $destFileNameVerzeichnis- und Dateiinformationen enthält. (d. h. es sieht ungefähr so ​​aus "somedirectory\myfile.txt", nicht wie myfile.txt)

Das Skript kopiert also Dateien vom C:\Laufwerk nach E:\und nach D:\.

Stellen Sie sich vor, es existiert eine Datei C:\myfile.txt:

Das Kopieren mit beiden Snippets führt zum gleichen Ergebnis: Ihr Snippet sagt „Kopieren Sie von c:\ nach d:\ und e:\. Ich mache nichts mit den Dateinamen, also lassen Sie sie einfach gleich“, das andere Snippet sagt „Kopieren Sie von c:\ nach d:\myfile.txt und e:\myfile.txt. Ich sage Ihnen explizit die Dateinamen.“

Stellen Sie sich vor, Sie haben eine DateiC:\somedirectory\myfile.txt

Es gibt einen Unterschied, da nach und erneut $_kopiert wird . Dabei wird die Tatsache ignoriert, dass die Datei in einem Verzeichnis enthalten war. Bei Verwendung wird die Datei nach D:\irgendeinVerzeichnis\meineDatei.txt kopiert.D:\myfile.txtE:\myfile.txtJoin-path $_ $destFileNameand E:\somedirectory\myfile.txt

Antwort3

Sie können einen doppelten Backslash C:\a\\a6ile0309.PxP(kleiner Fehler) und vermutlich unerwünschte Zeichen in der Originalausgabe (schwerer Fehler) sehen:

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

Letzteres wird durch falsch verwendete Formatbezeichner verursacht fundt

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

LesenFormatieren von Datums- und UhrzeitangabenUndFormatieren von Zahlen und Daten mit dem CultureInfo-Objekt:

  • fVollständiges Datum und Uhrzeit (langes Datum und kurze Uhrzeit)
  • t,%t Das erste Zeichen in der AM/PM-Bezeichnungdefiniert in AMDesignator oder PMDesignator, falls vorhanden. Geben Sie "%t" an, wenn das Formatmuster nicht mit anderen Formatmustern kombiniert wird.

Tatsächlich werden Ergebnisse bis zur letzten Millisekunde(?) oder Tick(?) fangezeigt afile, siehe letzte Anmerkung unten. Ehrlich gesagt weiß ich nicht, ob es vermieden werden kann, also versuchen Sie es mit dem folgenden Codeausschnitt:

'--- 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

Ausgabe:

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

bitte beachten SieDas

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

könnte geschrieben werden als

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

und ich weiß nicht, welche Notation besser oder korrekter ist (PowerShell-basiert).

Beachten Sie auchder Unterschied:

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

verwandte Informationen