我正在尝试学习一些有关 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'
我不知道哪种表示法更好或更正确(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