
我正在嘗試了解一些有關 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.txtand 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'
我不知道哪種表示法更好或更正確(PowerShellish)。
另請注意區別:
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