基本 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.txtE:\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

相关内容