什么是在PowerShell中下载和执行文件的最短代码?
古老的格言是避免优化,除非有需要。程序应该同情可读性。如果代码难以理解,任何错误都很容易被复杂性所掩盖。正如一位老主人所说:
真正的问题是程序员花费了太多时间来担心在错误的地方和错误的时间提高效率;过早优化是编程中所有邪恶(或至少大部分)的根源。
- 唐纳德克努特
话虽这么说,您的样本可以通过使其更具可读性和可维护性进行优化。表现不会改变;到目前为止最慢的部分是获取远程文件。
考虑一下吧
$arr= @() #Empty array
$arr += new-object psobject -property @{"Src"="z:\monthlypayments.txt"; "Dst" = "monthend.txt"} # Add custom object for monthly into the array
$arr += new-object psobject -property @{"Src"="z:\weekly.txt"; "Dst" = "weekend.txt"} # Same for weekly
$arr # Print the array for illustration purposes
Src Dst
--- ---
z:\monthlypayments.txt monthend.txt
z:\weekly.txt weekend.txt
# Now that we have seen the data, let's use it
$wc = New-Object net.webclient
$arr | % { # Iterate through the array
$wc.DownloadFile($_.Src, $_.Dst) # Download items
}
因此,所做的是源数据项和目标数据项在数据结构中绑定在一起。源和目标不再是一堆字符串,而是对象的属性。对象存储在数组中。为了处理所有对象,可以使用Foreach-Object
(aka %
)迭代数组,$_
将逐个读取数组元素并将它们发送到管道。 .Src
表示管道上的当前对象 - foreach语句从数组中选取的元素。
通过使用这种方法,WebClient的DownloadFile不需要担心硬编码路径。它将从管道对象的属性.Dst
和qazxswpoi中读取它们。
现在,这显然是一种下载两个文件的方法。但是,如果你有二十个加工怎么办?然后,在脚本开头维护源 - 目标对会更加容易,其中所有源和目标元组都添加到数组中。