Powershell

PS—-PowerShell

Windows Powershell 是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用 .NETFramework的强大功能。
我么都知道在WIndows平台下,CMD环境默认的处理数据的能力很弱,特别是对于浮点数据和数值计算。而通常有很多文件或者数据需要在Windows上进行处理,在不考虑其他编译型程序语言的时候,可以使用Powershelll来完成很多复杂的操作。
Powershell是基于.net fremework建立的,而.NET提供了庞大的数据类库,包括常见运算和函数等等。
使用中需要注意一下:

  • Windows默认无法执行Powershell脚本,需要以管理员的身份打开CMD,然后执行set-ExecutionPolicy RemoteSigned
  • Powershell脚本以.ps1结尾,注意是数字1而不是字母l
  • 单行注释常用#,多行注释用<##>
  • 定义函数与awk十分相似,但是整个程序语句包括变量和结构又与perl相似
  • 长行换行用 `
  • 默认脚本执行后的输出编码为UTF16,我们需要将其转为UTF8才能正常使用。方法很多,可以采用下面两种方式:
    • 直接用命令Powershell .\yourscript.ps1 > out.txt
    • 直接命令Powershell ".\yourscript.ps1 |out-file out.txt -encoding utf8"

构建两水球碰撞体系

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<#
set-ExecutionPolicy RemoteSigned
command | out-file new_ball.gro -encoding utf8
#>

function ReadGro($filename, $position, $isfirst) {
$inputfile = Get-Content $filename | where {!([string]::IsNullOrEmpty($_))}
$Natoms = [int]$inputfile[1]
if($isfirst -eq 1) {
$inputfile[0]
2*$Natoms
}
for($i = 0; $i -lt $Natoms; $i++) {
if($position -eq "left") {
$novelocity = $inputfile[$i+2].substring(0, 44)
"{0,44}{1,8:N4}{2,8:N4}{3,8:N4}" -f $novelocity, 1, 0, 0
}
elseif($position -eq "rigth") {
$x = [double]$inputfile[$i+2].substring(20, 8)+10
$frontx = $inputfile[$i+2].substring(0, 20)
$afterx_and_frontvx = $inputfile[$i+2].substring(28, 16)
"{0,20}{1,8:N3}{2:16}{3,8:N4}{4,8:N4}{5,8:N4}" -f $frontx, $x, `
$afterx_and_frontvx, -1, 0, 0
}
}
if($isfirst -eq 0) {
#$box = $inputfile[$Natoms+2].trim() -replace "\s{2,}", " "
#"{0:N6} {1:N6} {2:N6}" -f ([double]$box.split()[0]+10), `
# [double]$box.split()[1], [double]$box.split()[2]
$lx, $ly, $lz = $inputfile[$Natoms+2].split(" ", [StringSplitOptions]::RemoveEmptyEntries)
"{0:N6} {1:N6} {2:N6}" -f ([double]$lx+10), [double]$ly, [double]$lz
}
}

ReadGro .\ball.gro "left" 1
ReadGro .\ball.gro "rigth" 0