基本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.txtand 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」。

事實上,fafile最後一毫秒(?)或刻度(?)的結果中,請參閱下面的最後一個註釋。老實說,我不知道它是否可以轉義,所以請嘗試以下程式碼片段:

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

相關內容