基本的な Powershell スクリプト

基本的な Powershell スクリプト

私は 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

後者はフォーマット指定子の誤用によって引き起こされft

(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

関連情報