忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 1531 | 回复: 7

[学习共享] ps第8课:用powershell读写文本、二进制文件。 [复制链接]

论坛徽章:
0
发表于 2017-08-14 12:07 |显示全部楼层
本帖最后由 本友会机友会摄友会 于 2017-08-16 12:42 编辑

----------------------------------------------
问:powershell如何读取文本?
答:
shell读取文本,可以用:变量名 < while
而powershell中没有【<】,powershell读取文本用【=】
$变量名 = get-content 文件路径

$数组a = get-content  文件路径  #把文件按行切割,然后存入【数组a】。自动识别回车格式。
$字符串b = get-content  文件路径  -raw #读取文件,整个文件存入【字符串b】,不分行。

参考手册
https://docs.microsoft.com/zh-cn/powershell/module/Microsoft.PowerShell.Management/Get-Content?view=powershell-5.1

常用参数:
-ReadCount  0    #通过管道,一次发送全部 。开大文件变迅速
-OutBuffer  #在调用管道下一个cmdlet前缓冲的数量 int 32
-wait           #不退出,用于查看日志
-TotalCount 123 #只获取前123行。
-Tail -Head #头,尾。
-Stream  #ntfs文件流,不常用。
-Delimiter  #分割符
-encoding 编码值 #要读取的源文件,如果没有bom头,则应指定源文件编码。有bom头无需。

----------------------------------------------
问:powershell如何写入,覆盖写入,文本文件?
答:
powershell写入文本不用【>】,而用set-content命令。
$a = 'abc'
Set-Content -LiteralPath d:\123.txt -Value $a  #用变量a的内容,覆盖所有文件。

参考手册
https://docs.microsoft.com/zh-cn/powershell/module/Microsoft.PowerShell.Management/Set-Content?view=powershell-5.1

常用参数:
-encoding 编码值 #设定目标文件编码。
-nonewline   #写入-Value指定的内容后,不在后面插入一个回车。默认插入一个回车。
----------------------------------------------
问:powershell如何追加文本?
答:
powershell追加文本不用【>>】,而用add-content命令。
$a = 'abc'
Add-Content -LiteralPath d:\123.txt -Value $a

参考手册
https://docs.microsoft.com/zh-cn/powershell/module/Microsoft.PowerShell.Management/Add-Content?view=powershell-5.1

常用参数:
-encoding 编码值 #设定目标文件编码。
-nonewline   #写入-Value指定的内容后,不在后面插入一个回车。默认插入一个回车。
----------------------------------------------
问:powershell如何插入文本行?
比如,第一行(即在第0行后),第n行(即在第n-1行后)
答:
文本毕竟不是sql,powershell未提供直接插入命令。
可以把文本用get-content读取如arraylist对象,然后再insert,然后再保存。

问:powershell如何删除文本行?
答:
既然打开文本后,输出的是数组,那么删除行就是折腾数组中的元素。
比如6行文本0---5,想删除第三行(即第2个元素),可以这样。
$文件[0..2,4..5]
----------------------------------------------
问:powershell如何清空文本?
答:
clear-content

----------------------------------------------
问:powershell如何从管道输出文本?
答:
xxx命令 | out-file    xxx.txt
点评:
powershell玩的是属性。属性是无空格,无需进一步处理的raw数据。可以很方便从文本和对象之间转换。
从这个角度来说,尽量用export-csv等,尽量不用out-file。一旦out-file就变成字符串了,我们的武功就全废了。
----------------------------------------------
问:powershell如何输出csv?
答:
对象组 | export-csv
输出

----------------------------------------------
问:powershell如何,边显示,边输出?
答:
tee-object
----------------------------------------------
问:
powershell如何读写,二进制文件?
powershell如何读写,大文件?
答:
简单来说,是通过调用.net,通过二进制的方法,来读写的。
操作系统读写大文件,都是使用二进制(文件流)的形式。
通过更改字节偏移量,来实现io跳转。
然后读写bytes,具体请看手册:
https://msdn.microsoft.com/zh-cn/library/system.io.filestream(v=vs.110).aspx

----------------------------------------------
问:powershell如何,读写【文本】大文件?
答:
1打开文件流后,存入变量a。
2通过文本的方式,打开文件流a,成为b。这里面有两个问题。
2.1合法文本是不含【00h】,【和其他非法字符】的。也就是说,你要人为写代码判断【二进制流】中,是否含有非法字符。
2.2合法文本,是通过【回车符,如0d0ah】分割的字符串。也就是说,你要人为写代码判断,两个回车间距,是不是太大。
或者说,一行是不是好几个GB。太大的行,容易导致内存溢出。
旁白:我帮人处理300gb大文本,结果文本有上述2问题,气死我了。
3大文件必须,一行行读取。一行行处理。
在文件行长度合理,没有非法字符的情况下,下述代码极快!
$文件流 = New-Object System.IO.FileStream($输入文件绝对路径)
$文件 = New-Object System.IO.StreamReader($文件流,[System.Text.Encoding]::utf
$行 = $文件.readline()
#你的处理语句xxx
$文件流.Dispose()
----------------------------------------------
问:powershell如何判断【EOF】?
答:
ps(和py)中没有【EOF】,不用【EOF】字符。而用【空】,或【读异常】,或【-1】之类来实现判断eof。
具体应该看方法手册中的说明。如:
if ($行 -eq $null)
{
$eof = $true
  continue
}


----------------------------------------------
问:要被powershell处理的文件,被锁定怎么办?如何找出锁定文件的元凶?
答:
1 没必要找出元凶。不能读写就报错,报错就捕获。知道文件不可读,或不可写,就跳转到处理代码。
try{get-content},或者try{set-content}即可。
2System.IO.FileStream的高级用法中,有设置文件由一个线程只读的办法,有并发写入文件的办法。
并发读,并发写,就不会报锁定的错误。

3可以用微软出品的Process Explorer,按 Ctrl + F 搜索哪个进程锁定了哪个文件,但和脚本基本无关。





----------------------------------------------
powershell不学【<】,powershell不会【<<】,powershell不懂【EOF】,却照样 觉得自己 很牛x。
http://bbs.chinaunix.net/thread-4263186-1-1.html
http://bbs.chinaunix.net/thread-4263333-1-1.html


==========================================
powershell脚本第一课:面向对象简介1
http://bbs.chinaunix.net/thread-4263988-1-1.html




ps第二课:常用对象类型
http://bbs.chinaunix.net/thread-4264061-1-1.html



ps第三课:面向对象语言有啥优缺点?
http://bbs.chinaunix.net/thread-4264062-1-1.html



ps第4课:文件目录对象介绍
http://bbs.chinaunix.net/thread-4264293-1-1.html



ps第5课:常用帮助命令
http://bbs.chinaunix.net/thread-4264294-1-1.html



ps第6课:单个字符对象,讲ps如何处理单个字符,含汉字
http://bbs.chinaunix.net/thread-4264556-1-3.html


ps第7课:powershell到底有何优势,为什么要学?
http://bbs.chinaunix.net/thread-4264776-1-1.html

--------------------------------------------------------


字符界面版,powershell2048游戏。win_linux_通用
http://bbs.chinaunix.net/thread-4260709-1-1.html


http://bbs.chinaunix.net/thread-4266193-1-1.html
跨平台ps命令行游戏:《抽一张扑克牌比大小.ps1》



论坛徽章:
130
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2017-08-14 19:00 |显示全部楼层
本帖最后由 jason680 于 2017-08-17 12:29 编辑

就来说说PSH问题

说OO 不OO
  new FILE-object 文本 ...
或是
  文本对象.content

说shell 不shell
  type 文本

get-content 这什么?

论坛徽章:
0
发表于 2017-08-15 13:37 |显示全部楼层
get-content 这什么?
答:
get:获取
set:设置
clear:清空
add:追加
content:文件内容


论坛徽章:
130
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2017-08-15 14:06 |显示全部楼层
本帖最后由 jason680 于 2017-08-15 14:41 编辑

要学PowerShell
要先学自欺欺人
说是面向对象 不是面向对象
说是shell脚本 又不是shell脚本

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2017-08-15 15:36 |显示全部楼层
回复 3# 本友会机友会摄友会


论坛徽章:
0
发表于 2017-08-15 16:20 |显示全部楼层
本帖最后由 本友会机友会摄友会 于 2017-08-15 16:22 编辑
jason680 发表于 2017-08-15 14:06
要学PowerShell
要先学自欺欺人
说是面向对象 不是面向对象

你在二楼说的,我没反驳你。这后来你又强调了一遍,那我就不得不回复了。
我倒是有个观点,cu中的部分货,只会说观点。说的不清不楚,说完就跑。从来拿不出证据。
哪里不是面向对象了,你倒是说出来呀?

在 【ps第7课:powershell到底有何优势,为什么要学?】中,我说到【powershell取py和shell的优点
这优点就是
1 比shell更面向对象。
论据是:【ps第7课:powershell到底有何优势,为什么要学?】中的【面向对象方法之妙】,【属性之妙】等。

2 比py更shell。开源+免费+(可运行第三方命令的)命令行+线程+远程+管道。

实际上,你的这些个观点,建议跟帖。【ps第7课:powershell到底有何优势,为什么要学?】而不是本帖。

我天天在讲文件对象,单个字符对象,以后还要讲字符串对象,数组对象的使用方法。






论坛徽章:
130
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2017-08-17 13:20 |显示全部楼层
首先说明 这回应主要是给
要学习powershell的人看清真象
(没人跟你说的真象...)

所以不是回应给楼主
因为 楼主 已经没救了...


1. 一个好的编程/腳本,自然有很多人会去用...
不须要楼主你在那说多好又多好...
powershell(2006年至今)已经十年多了,用的人少的可怜...
楼主一直说比python,perl,bash,...强
但python,perl,bash排名都在powershell之前
证据1: TIOBE https://www.tiobe.com/tiobe-index/
证据2: Windows10支持BASH

2. powershell不是真的面向对象,也不是shell腳本 ...
http://blog.csdn.net/powershell/article/details/1725880
  ..., PowerShell v1(版本1.0)希望使用者与对象交互, 但没有真正提供面向对象创建的语法,...
  ... 为什么不使用已有的shell或扩展cmd.exe呢?....
  ..., PowerShell开发队伍为了能够为Windows提供更好的优化, 因此选择了重新创建一门新的语言.

shell腳本,就是不改变原来(command line)使用方法...
但powershell并不是...虽然名称中有shell字样,但它就不是shell脚本


https://powertoe.wordpress.com/2 ... ted-language-right/
... PowerShell doesn’t have real inheritance.



3. MS的策略,就是让你一直换...
这也不是MS第一次有问题的产品/策略...
Windows ME, Windows Vista,都是例子...
powershell有问题,也没什么好意外的(换就好了)...
就算是成功产品也是要换,VB换VB.net,
VC换VC.net, C#, ...
注:WMIC应该也是要被换掉的例子....

...




论坛徽章:
6
数据库技术版块每日发帖之星
日期:2015-11-27 06:20:00程序设计版块每日发帖之星
日期:2015-12-01 06:20:00每日论坛发贴之星
日期:2015-12-01 06:20:0015-16赛季CBA联赛之佛山
日期:2017-03-26 23:38:0315-16赛季CBA联赛之江苏
日期:2017-07-17 10:08:4415-16赛季CBA联赛之北京
日期:2018-03-04 17:01:50
发表于 2017-08-17 17:16 |显示全部楼层
jason680 发表于 2017-08-17 13:20
首先说明 这回应主要是给
要学习powershell的人看清真象
(没人跟你说的真象...)
因为 楼主 已经没救了...

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP