
私は PowerShell スクリプトについて少し学ぼうとしており、このスニペットを含むスクリプトを論理的に分解しようとしています。
$destFolders | Foreach-Object { Copy-Item -Path $Source -dest (Join-Path $_ $destFileName) }
これを最初から書くとしたら、次のように書くと思います。なぜ間違っているのでしょうか?
$destFolders | Foreach-Object { Copy-Item -Path $Source -dest ($_) }
全文: - $destfilename が定義されていないことに注意してください。おそらくエラーです(?)
$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)}
答え1
$destFolders
この行には、、、などの要素が含まれており$Source
、$destFileName
これらは完全なスクリプトの一部であるように見えます。これらの要素とその目的を知らなければ、私の回答は間違っている可能性があります。
しかしコピーアイテムコマンドには、アイテムをコピーして名前を変更する機能もあります。これはまさにスクリプトの最初の行が行っていることのようです。あなたの行はアイテムをコピーするだけです。
答え2
簡単に言うと:ディレクトリとファイルの情報が含まれているJoin-Path
場合に、フォルダー構造を維持できます。(つまり、 ではなく の$destFileName
ようになります)"somedirectory\myfile.txt"
myfile.txt
したがって、スクリプトはC:\
ドライブからおよびにE:\
ファイルをコピーしますD:\
。
次のファイルがC:\myfile.txt
存在すると想像してください:
両方のスニペットを使用してコピーすると、同じ結果になります。スニペットには「c:\ から d:\ および e:\ にコピーします。ファイル名については何もしないので、そのままにしておきます」と書かれていますが、もう一方のスニペットには「c:\ から d:\myfile.txt および e:\myfile.txt にコピーします。ファイル名を明示的に指定します」と書かれています。
ファイルがあると想像してくださいC:\somedirectory\myfile.txt
$_
では、コピー先D:\myfile.txt
とコピーしない先で違いがありますE:\myfile.txt
。ファイルがディレクトリ内に含まれているという事実は無視されます。 を使用すると、Join-path $_ $destFileName
ファイルは D:\somedirectory\myfile.txt にコピーされます。and E:\somedirectory\myfile.txt
答え3
二重のバックスラッシュC:\a\\a6ile0309.PxP
(軽微なミス) と、元の出力 (重大なエラー) に不要な文字が含まれていることがわかります。
a6ile0309.PxP
↑ ↑ ↑
↓ ↓ ↓
afile0309.txt
後者はフォーマット指定子の誤用によって引き起こされf
、t
(get-date).AddDays(-4).ToString('afileMMdd.txt')
# ↑ ↑ ↑
読む日付と時刻の書式設定そしてCultureInfo オブジェクトを使用して数値と日付を書式設定する:
f
完全な日付と時刻(長い日付と短い時刻)t
、%t
AM/PM指定子の最初の文字AMDesignator または PMDesignator で定義されている場合。フォーマット パターンが他のフォーマット パターンと組み合わされていない場合は、"%t" を指定します。
実際、最後のミリ秒(?)またはティック(?)の結果f
についてはafile
、以下の最後の注記を参照してください。正直なところ、エスケープできるかどうかはわかりませんので、次のコード スニペットを試してください。
'--- 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
出力:
PS D:\PShell> D:\PShell\SU\1187865.ps1
--- original ---
a6ile0309.PxP C:\a\\a6ile0309.PxP
--- use rather ---
afile0309.txt C:\a\afile0309.txt
ご注意くださいそれ
$filename = 'afile' + (get-date).AddDays(-4).ToString('MMdd') + '.txt'
次のように書くことができる。
$filename = '{0}{1}{2}' -f 'afile' , (get-date).AddDays(-4).ToString('MMdd') , '.txt'
どちらの表記法がより適切か、より正しいかは分かりません(PowerShell風)。
また、違い:
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