
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
, $Source
und $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-Path
ermöglicht Ihnen die Verwaltung der Ordnerstruktur, sofern diese $destFileName
Verzeichnis- 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.txt
E:\myfile.txt
Join-path $_ $destFileName
and 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 f
undt
(get-date).AddDays(-4).ToString('afileMMdd.txt')
# ↑ ↑ ↑
LesenFormatieren von Datums- und UhrzeitangabenUndFormatieren von Zahlen und Daten mit dem CultureInfo-Objekt:
f
Vollstä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(?) f
angezeigt 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