Board logo

标题: [问题求助] powershell从零开始,学习笔记 [打印本页]

作者: for_flr    时间: 2021-11-24 10:02     标题: powershell从零开始,学习笔记

感慨,powershell入门真难,我准备在这个帖子将学习过程记录下来。
期待高人路过顺手指点。

powershell难在哪里?
批处理命令学起来相当简单,论坛一日一教学,每个命令怎么用,有哪些参数,清清楚楚;powershell教程里,看起来云里雾里。
打算用powershell刷论坛里新手练功区的题目,以此开始学习。

第一题,生成001--到999之间的数字。
  1. @echo off
  2. for /l %%i in (1001 1 1999) do (
  3.   set var=%%i
  4.   call echo %%var:~-3%%
  5. )
  6. pause
复制代码

作者: for_flr    时间: 2021-11-24 11:09

本帖最后由 for_flr 于 2021-11-29 14:02 编辑

搜寻得到
  1. $num=1001..1999
复制代码
可以产生1001-1999的序列数字,原以为对每个数字进行字符串截取即可完成.
找到"abcdefg".remove(3,4)这样的字符串截取方法。
却发现不允许$num.remove(0,1)这样的用法。
老实用do循环吧,每个数字前补0即可。
  1. $aa=1
  2. do
  3. {
  4. $bb="{0:d3}" -f ($aa)
  5. $bb
  6. $aa++
  7. }
  8. until($aa -gt 999)
  9. cmd /c pause
复制代码
附上一段powershell字符串处理资料:
  1. 1、字符串格式化
  2.   在说字符串格式化,首先得说单双引号的作用,在powershell中双引号不会屏蔽变量,但单引号会屏蔽,示例如下:
  3. PS C:\> $a = "i have a dream."
  4. PS C:\> Write-Output "this is $a"
  5. this is i have a dream.
  6. PS C:\> Write-Output 'this is $a'
  7. this is $a
  8.   由上述示例我们可以看出,使用单引号会对变量进行转义,而使用双引号则会输出变量的值。
  9.   接下来,再看看字符串格式化的使用,示例如下:  
  10. PS C:\> $a = "i have a dream."
  11. PS C:\> $b = " the variable is $a ,value is {0},there are {1} words" -f $a,4
  12. PS C:\> Write-Output $b
  13. the variable is i have a dream. ,value is i have a dream.,there are 4 words
  14.   字符串格式换中,使用{0},{1},{2}...来代替字符串中变量的位置,-f  后的参数与前面的位置变量相对应。
  15.   接下来我们来探究一下花括号{} 内部的秘密:
  16. 秘密一——固定行宽,即指定每次输入的字符长度,不足的空白补全。
  17. PS C:\> $a = "name"
  18. PS C:\> $b = "age"
  19. PS C:\> $c = "sex"
  20. PS C:\> $d = "{0,-15}{1,-15}{2,-15}"
  21. PS C:\> $d = "{0,-15}{1,-15}{2,-15}" -f $a,$b,$c
  22. PS C:\> Write-Output $d
  23. name           age            sex  
  24.   {0,-15}表示的是第一的变量,占位字符总长度是15,“-”代表左对齐
  25.   【注】{位置,±占位总长},其中“+”代表右对齐,“-”代表左对齐
  26. 秘密二——将数字转换成百分数
  27. PS C:\> "{0:p}" -f 0.31415926
  28. 31.42%
  29. PS C:\> "{0:p3}" -f 0.31415926
  30. 31.416%
  31. PS C:\> "{0:p5}" -f 0.31415926
  32. 31.41593%
  33. PS C:\> "{0:p}" -f "1.23"
  34. 1.23
  35.   百分数转换是用“p”来表示的,默认保留两位有效数字,若“p”后的数字是5,那么就代表保留五位有效数字。
  36.   注意:百分数的转换针对的是整型和浮点型,不能对字符进行转换。
  37. 秘密三——保留几位小数
  38. PS C:\> "{0:n0}" -f 3.1415
  39. 3
  40. PS C:\> "{0:n}" -f 3.1415
  41. 3.14
  42. PS C:\> "{0:n3}" -f 3.1415
  43. 3.142
  44.   n代表要保留几位有效数字,默认是两位有效数字
  45. 2、字符串替换
  46. PS C:\> "i have a dream" -replace "dream","apple"
  47. i have a apple
  48. PS C:\> "i have a dream" -replace "DREAM","apple"
  49. i have a apple
  50. PS C:\> "i have a dream" -creplace "DREAM","apple"
  51. i have a dream
  52. PS C:\> "i have a dream" -creplace "dream","apple"
  53. i have a apple
  54.   字符串替换是“-replace”参数,-replace 可以不区分大小写,而-creplace严格按照大小写来匹配。
  55. 3、包含
  56. PS C:\> "i have a dream" -match "i"
  57. True
  58. PS C:\> "i have a dream" -match "I"
  59. True
  60. PS C:\> "i have a dream" -cmatch "i"
  61. True
  62. PS C:\> "i have a dream" -cmatch "I"
  63. False 
  64. PS C:\> "i have a dream".Contains("have")
  65. True
  66. PS C:\> "i have a dream".Contains("Have")
  67. False
  68.   判断某个字符串是否包含,返回True或False,“-cmatch”严格匹配大小写。
  69.        其实-match的作用不止这些,下一节会提到它的扩展。
  70. 4、过滤器
  71. PS C:\> "3.1415926" -like "3.14*"
  72. True
  73.   “-like”参数支持基本的正则表达式,*代表任意所有,?代表一个字符,.只代表.
  74.   判断字符串的格式是否符合用户所要求的,如上例,“3.14*”表示已以3.14开头的字符,匹配即为True。
  75. 5、字符串分割(将字符串转成列表)
  76. PS C:\> "i have a dream".Split()
  77. i
  78. have
  79. a
  80. dream
  81. PS C:\> "i have a dream".Split("a")
  82. i h
  83. ve
  84. dre
  85. m
  86.   split的作用是将字符串中按照某个字符来分割成列表,默认以空格分割,支持多个分隔符
  87. PS C:\> "http://www.baidu.com".Split('./:')
  88. http
  89. www
  90. baidu
  91. com
  92.   上述例子是将某个字符以“.” “/” “:”来分割,分割出的结果含有两个空白,原因是“/”和“:”都是分隔符,当分割了“:”后,http会与之后的字符分为两行,此时用需要用“/”来分割,在此基础上再次分割,因此产生了空白行,空白行的取消方法如下:
  93. PS C:\> "http://www.baidu.com".Split('./:',[StringSplitOptions]::RemoveEmptyEntries)
  94. http
  95. www
  96. baidu
  97. com
  98.  6、字符串比较  
  99. PS C:\> "i have a dream ".CompareTo("i have a dream")
  100. 1
  101. PS C:\> "i have a dream ".CompareTo("i have a dream ")
  102. 0
  103. PS C:\> "i have a dream ".CompareTo("i have a Dream ")
  104. -1
  105.   字符串比较不支持“-CompareTo”,使用方法是“.CompareTo”,严格区分大小写,完全一致才返回“0”。
  106. 7、字符串的长度
  107. PS C:\> "i have a dream".Length
  108. 14
  109. 8、插入新的字符串
  110. PS C:\> "i have a dream".Insert(9,"new ")
  111. i have a new dream
  112.   Insert的使用方法,在某个位置插入什么字符串,字符串的第一个字符的下标是0,从0开始算起,上述例子,在下位为(9+1)的位置插入“new ”字符串
  113. 9、删除指定的字符串
  114. PS C:\> "i have a dream".Remove(9,5)
  115. i have a
  116.   同上述例子,下标从0开始,在某个位置删除几个字符。
  117. 10、将多个字符串按特定规则组成一个
  118. PS C:\> "i","have","a","dream" -join(" ")
  119. i have a dream
  120.   上述例子是将多个字符串以空格分割组成,同样也可以以其他符合组合,比如:
  121. PS C:\> "10","20","30" -join(":")
  122. 10:20:30 
复制代码

作者: for_flr    时间: 2021-11-25 10:09

第二题,去除歌曲编号(重命名)
  1. ::测试环境生成
  2. @echo off
  3. md 测试目录
  4. cd 测试目录
  5. del/q *
  6. cd.>"001 - 萨顶顶 - 万物生.mp3"
  7. cd.>"002 - 萨顶顶 - 神香.wma"
  8. cd.>"003 - 邓丽君 - 月亮代表我的心.mp3"
  9. cd.>"011 - 戴娆 - 绽放.mp3"
  10. cd.>"010 - 梦之旅 - 铃儿响叮当.mp3"
  11. cd.>"007 - 卓依婷 - 捉泥鳅.mp3"
  12. cd.>"009 - 周杰伦 - 稻香.wma"
  13. cd.>"005 - Lene - Pretty Young Thing.wma"
  14. cd.>"029 - M2M - The Day You Went Away.mp3"
复制代码
wp3格式和wma格式歌曲,去除歌曲名字前面的编号,只剩歌名、歌手
批处理可以这样写:
  1. @echo off
  2. for /f "delims=" %%a in ('dir /b /a-d *.mp3 *.wma') do (
  3.     for /f "tokens=1,2,3 delims=-" %%i in ("%%~na") do (
  4.         ren "%%~a" "%%j - %%k%%~xa"
  5.     )
  6. )  
复制代码

作者: for_flr    时间: 2021-11-25 10:17

本帖最后由 for_flr 于 2021-11-25 11:26 编辑

powershell可以这样写
  1. get-childitem -path .\* -include *.wma,*.mp3|rename-item -newname{
  2. $_.name.remove(0,$_.name.indexof("-")+1)
  3. }
复制代码
思路是用.indexof("-")返回第一个分隔符-所在文件名长度位置,然后用.remove()将那段长度删除。
搜索资料隐约确定,-filter只能有一个参数,-include可以跟多个参数。
用-include参数,路径用\*
$_ 类似于批处理中的%%a
本帖记录学习过程,个中错误,望指正。
——————————
根据下一楼资料,如果要获取歌曲名称,删除编号和歌手,可以用lastindexof()获取分隔符最后出现的位置,用substring()截取字符串
  1. get-childitem -path .\* -include *.wma,*.mp3|rename-item -newname{
  2. $_.name.substring($_.name.lastindexof("-")+1)
  3. }
复制代码

作者: for_flr    时间: 2021-11-25 10:28

下面给出String对象的所有方法:

函数        描述        示例
CompareTo()        与另一个字符串比较        (“Hello”).CompareTo(“Hello”)
Contains()        是否包含制定子串        (“Hello”).Contains(“ll”)
CopyTo()        拷贝子串至新字符串中        $a = (“HelloWorld”).toCharArray()(“User!”).CopyTo(0, a, 6, 5)a,6,5)a
EndsWith()        是否以制定子串结尾        (“Hello”).EndsWith(“lo”)
Equals()        是否与另一个字符串相同        (“Hello”).Equals($a)
IndexOf()        返回第一次匹配的所索引        (“Hello”).IndexOf(“l”)
IndexOfAny()        返回字符串中任意字符的首次匹配索引        (“Hello”).IndexOfAny(“loe”)
Insert()        在指定位置插入字符串        (“HelloWorld”).Insert(6,”brave “)
GetEnumerator()        枚举字符串中所有字符        (“Hello”).GetEnumerator()
LastIndexOf()        字符的最后匹配位置        (“Hello”).LastIndexOf(“l”)
LastIndexOfAny()        任意字符的最后匹配位置        (“Hello”).LastIndexOfAny(“loe”)
PadLeft()        左边补齐空白是字符串至指定长度        (“Hello”).PadLeft(10)
PadRight()        右边填充空白是字符串至指定长度        (“Hello”).PadRight(10) + “World!”
Remove()        从指定位置开始移除指定长度        (“PsTips”).Remove(2,2)
Replace()        替换指定字符串        (“PsTips”).replace(“Ps”,”PS1″)
Split()        以指定分隔符切割字符串        (“HelloWorld”).Split(“l”)
StartsWith()        是否以指定子串开始        (“HelloWorld”).StartsWith(“He”)
Substring()        从指定位置取指定长度子串        “HelloWorld”).Substring(4,3)
ToCharArray()        转换成字符数组        (“HelloWorld”).toCharArray()
ToLower()        转换成小写        (“HelloWorld”).toLower()
ToLowerInvariant() 以区域规则转换成小写        (“HelloWorld”).ToUpperInvariant()
ToUpper()        转换成大写        (“HelloWorld”).ToUpper()
ToUpperInvariant() 以区域规则转换成大写        (“HelloWorld”).ToUpperInvariant()
Trim()        移除字符串前后空格        (” HelloWorld “). Trim()
TrimEnd()        移除字符串结尾的空格        (“HelloWorld “). TrimEnd()
TrimStart()        移除字符串开始的空格        (” HelloWorld”). TrimStart()
Chars()        返回指定位置的字符        (“Hello”).Chars(0)
作者: xczxczxcz    时间: 2021-11-25 20:02

完整的:
  1. System.Object Clone()
  2.   > System.Object ICloneable.Clone()
  3. int CompareTo(System.Object value)
  4.   > int CompareTo(string strB)
  5.   > int IComparable.CompareTo(System.Object obj)
  6.   > int IComparable[string].CompareTo(string other)
  7. bool Contains(string value)
  8. void CopyTo(int sourceIndex, char[] destination, int destinationIndex, int count)
  9. bool EndsWith(string value)
  10.   > bool EndsWith(string value, System.StringComparison comparisonType)
  11.   > bool EndsWith(string value, bool ignoreCase, cultureinfo culture)
  12. bool Equals(System.Object obj)
  13.   > bool Equals(string value)
  14.   > bool Equals(string value, System.StringComparison comparisonType)
  15.   > bool IEquatable[string].Equals(string other)
  16. System.CharEnumerator GetEnumerator()
  17.   > System.Collections.IEnumerator IEnumerable.GetEnumerator()
  18.   > System.Collections.Generic.IEnumerator[char] IEnumerable[char].GetEnumerator()
  19. int GetHashCode()
  20. type GetType()
  21. System.TypeCode GetTypeCode()
  22.   > System.TypeCode IConvertible.GetTypeCode()
  23. int IndexOf(char value)
  24.   > int IndexOf(char value, int startIndex)
  25.   > int IndexOf(string value)
  26.   > int IndexOf(string value, int startIndex)
  27.   > int IndexOf(string value, int startIndex, int count)
  28.   > int IndexOf(string value, System.StringComparison comparisonType)
  29.   > int IndexOf(string value, int startIndex, System.StringComparison comparisonType)
  30.   > int IndexOf(string value, int startIndex, int count, System.StringComparison comparisonType)
  31.   > int IndexOf(char value, int startIndex, int count)
  32. int IndexOfAny(char[] anyOf)
  33.   > int IndexOfAny(char[] anyOf, int startIndex)
  34.   > int IndexOfAny(char[] anyOf, int startIndex, int count)
  35. string Insert(int startIndex, string value)
  36. bool IsNormalized()
  37.   > bool IsNormalized(System.Text.NormalizationForm normalizationForm)
  38. int LastIndexOf(char value)
  39.   > int LastIndexOf(char value, int startIndex)
  40.   > int LastIndexOf(string value)
  41.   > int LastIndexOf(string value, int startIndex)
  42.   > int LastIndexOf(string value, int startIndex, int count)
  43.   > int LastIndexOf(string value, System.StringComparison comparisonType)
  44.   > int LastIndexOf(string value, int startIndex, System.StringComparison comparisonType)
  45.   > int LastIndexOf(string value, int startIndex, int count, System.StringComparison comparisonType)
  46.   > int LastIndexOf(char value, int startIndex, int count)
  47. int LastIndexOfAny(char[] anyOf)
  48.   > int LastIndexOfAny(char[] anyOf, int startIndex)
  49.   > int LastIndexOfAny(char[] anyOf, int startIndex, int count)
  50. string Normalize()
  51.   > string Normalize(System.Text.NormalizationForm normalizationForm)
  52. string PadLeft(int totalWidth)
  53.   > string PadLeft(int totalWidth, char paddingChar)
  54. string PadRight(int totalWidth)
  55.   > string PadRight(int totalWidth, char paddingChar)
  56. string Remove(int startIndex, int count)
  57.   > string Remove(int startIndex)
  58. string Replace(char oldChar, char newChar)
  59.   > string Replace(string oldValue, string newValue)
  60. string[] Split(Params char[] separator)
  61.   > string[] Split(char[] separator, int count)
  62.   > string[] Split(char[] separator, System.StringSplitOptions options)
  63.   > string[] Split(char[] separator, int count, System.StringSplitOptions options)
  64.   > string[] Split(string[] separator, System.StringSplitOptions options)
  65.   > string[] Split(string[] separator, int count, System.StringSplitOptions options)
  66. bool StartsWith(string value)
  67.   > bool StartsWith(string value, System.StringComparison comparisonType)
  68.   > bool StartsWith(string value, bool ignoreCase, cultureinfo culture)
  69. string Substring(int startIndex)
  70.   > string Substring(int startIndex, int length)
  71. bool IConvertible.ToBoolean(System.IFormatProvider provider)
  72. byte IConvertible.ToByte(System.IFormatProvider provider)
  73. char IConvertible.ToChar(System.IFormatProvider provider)
  74. char[] ToCharArray()
  75.   > char[] ToCharArray(int startIndex, int length)
  76. datetime IConvertible.ToDateTime(System.IFormatProvider provider)
  77. decimal IConvertible.ToDecimal(System.IFormatProvider provider)
  78. double IConvertible.ToDouble(System.IFormatProvider provider)
  79. int16 IConvertible.ToInt16(System.IFormatProvider provider)
  80. int IConvertible.ToInt32(System.IFormatProvider provider)
  81. long IConvertible.ToInt64(System.IFormatProvider provider)
  82. string ToLower()
  83.   > string ToLower(cultureinfo culture)
  84. string ToLowerInvariant()
  85. sbyte IConvertible.ToSByte(System.IFormatProvider provider)
  86. float IConvertible.ToSingle(System.IFormatProvider provider)
  87. string ToString()
  88.   > string ToString(System.IFormatProvider provider)
  89.   > string IConvertible.ToString(System.IFormatProvider provider)
  90. System.Object IConvertible.ToType(type conversionType, System.IFormatProvider provider)
  91. uint16 IConvertible.ToUInt16(System.IFormatProvider provider)
  92. uint32 IConvertible.ToUInt32(System.IFormatProvider provider)
  93. uint64 IConvertible.ToUInt64(System.IFormatProvider provider)
  94. string ToUpper()
  95.   > string ToUpper(cultureinfo culture)
  96. string ToUpperInvariant()
  97. string Trim(Params char[] trimChars)
  98.   > string Trim()
  99. string TrimEnd(Params char[] trimChars)
  100. string TrimStart(Params char[] trimChars)
  101. char Chars(int index) {get;}
  102. int Length {get;}
复制代码

作者: xczxczxcz    时间: 2021-11-25 20:03

.NET 版
  1. 【 [System.String] 】
  2. ::Compare()
  3.    >static int Compare(string strA, string strB)
  4.    >static int Compare(string strA, string strB, bool ignoreCase)
  5.    >static int Compare(string strA, string strB, System.StringComparison comparisonType)
  6.    >static int Compare(string strA, string strB, cultureinfo culture, System.Globalization.CompareOptions options)
  7.    >static int Compare(string strA, string strB, bool ignoreCase, cultureinfo culture)
  8.    >static int Compare(string strA, int indexA, string strB, int indexB, int length)
  9.    >static int Compare(string strA, int indexA, string strB, int indexB, int length, bool ignoreCase)
  10.    >static int Compare(string strA, int indexA, string strB, int indexB, int length, bool ignoreCase, cultureinfo culture)
  11.    >static int Compare(string strA, int indexA, string strB, int indexB, int length, cultureinfo culture, System.Globalization.CompareOptions options)
  12.    >static int Compare(string strA, int indexA, string strB, int indexB, int length, System.StringComparison comparisonType)
  13. ::CompareOrdinal()
  14.    >static int CompareOrdinal(string strA, string strB)
  15.    >static int CompareOrdinal(string strA, int indexA, string strB, int indexB, int length)
  16. ::Concat()
  17.    >static string Concat(System.Object arg0)
  18.    >static string Concat(System.Object arg0, System.Object arg1)
  19.    >static string Concat(System.Object arg0, System.Object arg1, System.Object arg2)
  20.    >static string Concat(System.Object arg0, System.Object arg1, System.Object arg2, System.Object arg3)
  21.    >static string Concat(Params System.Object[] args)
  22.    >static string Concat(System.Collections.Generic.IEnumerable[string] values)
  23.    >static string Concat(string str0, string str1)
  24.    >static string Concat(string str0, string str1, string str2)
  25.    >static string Concat(string str0, string str1, string str2, string str3)
  26.    >static string Concat(Params string[] values)
  27.    >static string Concat[T](System.Collections.Generic.IEnumerable[T] values)
  28. ::Copy()
  29.    >static string Copy(string str)
  30. ::Equals()
  31.    >static bool Equals(string a, string b)
  32.    >static bool Equals(string a, string b, System.StringComparison comparisonType)
  33.    >static bool Equals(System.Object objA, System.Object objB)
  34. ::Format()
  35.    >static string Format(string format, System.Object arg0)
  36.    >static string Format(string format, System.Object arg0, System.Object arg1)
  37.    >static string Format(string format, System.Object arg0, System.Object arg1, System.Object arg2)
  38.    >static string Format(System.IFormatProvider provider, string format, System.Object arg0)
  39.    >static string Format(System.IFormatProvider provider, string format, System.Object arg0, System.Object arg1)
  40.    >static string Format(System.IFormatProvider provider, string format, System.Object arg0, System.Object arg1, System.Object arg2)
  41.    >static string Format(string format, Params System.Object[] args)
  42.    >static string Format(System.IFormatProvider provider, string format, Params System.Object[] args)
  43. ::Intern()
  44.    >static string Intern(string str)
  45. ::IsInterned()
  46.    >static string IsInterned(string str)
  47. ::IsNullOrEmpty()
  48.    >static bool IsNullOrEmpty(string value)
  49. ::IsNullOrWhiteSpace()
  50.    >static bool IsNullOrWhiteSpace(string value)
  51. ::Join()
  52.    >static string Join(string separator, Params string[] value)
  53.    >static string Join(string separator, Params System.Object[] values)
  54.    >static string Join(string separator, System.Collections.Generic.IEnumerable[string] values)
  55.    >static string Join(string separator, string[] value, int startIndex, int count)
  56.    >static string Join[T](string separator, System.Collections.Generic.IEnumerable[T] values)
  57. ::new()
  58.    >string new(System.Char*, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 value)
  59.    >string new(System.Char*, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 value, int startIndex, int length)
  60.    >string new(System.SByte*, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 value)
  61.    >string new(System.SByte*, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 value, int startIndex, int length)
  62.    >string new(System.SByte*, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 value, int startIndex, int length, System.Text.Encoding enc)
  63.    >string new(char[] value, int startIndex, int length)
  64.    >string new(char[] value)
  65.    >string new(char c, int count)
  66. ::ReferenceEquals()
  67.    >static bool ReferenceEquals(System.Object objA, System.Object objB)
  68. ::Empty()
  69.    >static string Empty {get;}
复制代码

作者: for_flr    时间: 2021-11-26 09:55

本帖最后由 for_flr 于 2021-11-30 09:11 编辑

字符串对象的方法太多,处理字符串上肯定是比cmd厉害。英语不好的同学,记忆起来挑战很大。
新手练功区第三、四、五题可以一起练习了。
三,批处理字符串替换
  1. set w=www.bathome.net
  2. set w=%w:bathome=powershell%
  3. echo;%w%
复制代码
powershell字符串替换
  1. $w="www.bathome.net"
  2. $w=$w.replace("bathome","powershell")
  3. $w
  4. write-host $w
复制代码
四,将“今日明月在”显示为“明月今日在”
  1. @echo off
  2. set "s=今日明月在"
  3. echo %s:~2,-1%%s:~0,2%%s:~-1,1%
  4. pause>nul&exit /b
复制代码
powershell还是用substring()
  1. $s="今日明月在"
  2. $s.substring(2,2)+$s.substring(0,2)+$s.substring(4,1)
复制代码
powershell打字量颇多......  对了,可以按TAB键自动补充命令输入。
五,简易密码登录
批处理一般这样写
  1. @echo off
  2. set pwd=123456
  3. set /p in=输入密码:
  4. if "%pwd%" equ "%in%" ( echo;密码正确 ) else ( echo;密码错误 )
  5. pause>nul
复制代码
powershell跟批处理一模一样。
set /p a=    等于  $a=read-host
echo;123         等于  write-host "123"
  1. $pwd=123456
  2. $in=read-host "输入密码:" -assecurestring
  3. #-assecurestring 参数,会用*符号掩盖用户输入的字符,secure安全,as介词“作为”,string字符串。所以我把这个参数记忆成“作为安全字符串”,哈~
  4. if ($pwd -eq $in) {write-host "密码正确"} else {write-host "密码错误"}
复制代码

作者: for_flr    时间: 2021-11-26 10:32

六题,循环十秒倒计时
批处理
  1. @echo off
  2. for /l %%a in (10 -1 1) do echo;%%a&ping 127.1 -n 2 >nul
复制代码
powershell
用get-help about_for获取for的帮助信息
  1. for ($i=10;$i -gt 0;$i-=1) {$i;ping 127.1 -n 2|out-null}
复制代码
()圆括号内用分号;分别隔开初始值;条件;循环方法
{}大括号内用分号;隔开命令语句
ping 127.1 >nul 不能用在powershell中,看不懂提示,不知为何,百度到可以用管道加out-null。
我相信powershell应该有停顿一秒的命令、方法,只是我暂时没找到。
作者: for_flr    时间: 2021-11-26 10:39

  1. for /f  "tokens=1,3,5 delims= "
复制代码
像这样挑选出第1,3,5列内容的用法,不知道powershell中有没有
一时想不到关键字去描述搜索
望路过大佬解惑
作者: for_flr    时间: 2021-11-26 11:29

本帖最后由 for_flr 于 2021-11-30 11:05 编辑

七题,随机显示星期几
周一 周二 周三 周四 周五 周六 周日
利用随机数随机显示一天
批处理:
  1. @echo off
  2. ::作者bbcc的代码
  3. set "code=周一 周二 周三 周四 周五 周六 周日"
  4. :main
  5. set /a strRan=%random%%%7+1
  6. for /f "tokens=%strRan% delims=, " %%a in ("%code%") do (echo %%a)
  7. pause>nul
  8. goto :main
复制代码
  1. @echo off
  2. ::作者lhjoanna的代码
  3. set "str=一二三四五六日"
  4. set /a num=%random%%%7
  5. call echo 星期%%str:~%num%,1%%
  6. pause>nul
复制代码
powershell只能说666
  1. get-random -input "周一","周二","周三","周四","周五","周六","周日"
复制代码
get-random太好用了
  1. get-random -min 1 -max 8 #产生1到7的随机数,数字可指定负数或小数
复制代码
大于等于最小值,小于最大值】
  1. get-random -input 1,2,3,4,5,6,7
  2. #从-input后添加的集合中随机产生一个,也可以加 -count参数产生指定数量个。
复制代码
  1. get-childitem|get-random -count 2
  2. #可以加管道,dir结果中随机挑选2个显示出来。
复制代码

作者: for_flr    时间: 2021-11-26 13:17

八题,建立1到10的文件夹,然后删除它们。
cmd
  1. for /l %%a in (1 1 10) do md %%a
复制代码
powershell中
new-item -name abc.txt -type file -value "hello" #new-item建立项,-name文件名,-value文件内容
new-item -name def -type directory #-type指定类型为文件或者文件夹。
  1. for ($i=1;$i -le 10;$i+=1){new-item -name $i -type directory} #建立1-10文件夹
复制代码
  1. get-childitem|?{$_.psiscontainer}|remove-item #删除目录下的文件夹
复制代码
暂时觉得批处理中,dir/b ,dir /s /a-d 等参数组合,比powershell更好用。
比如只显示当前目录下的文件夹
用$host看到我的ps版本为2.0,需要用
  1. get-childitem|?{$_.psiscontainer}    或者   get_childitem -exclude *.*
复制代码

作者: xczxczxcz    时间: 2021-11-26 13:29

回复 12# for_flr


    等你学了数组集合枚举就明了,很简单的,还是留给你自己补全好些。后面内容还很多,l/o,网络,注册表,计划任务,防火墙,安全,线程等一大堆东西。
作者: for_flr    时间: 2021-11-26 13:43

本帖最后由 for_flr 于 2021-11-26 13:52 编辑

第九题,给txt中文本内容添加汉字行号(不超过10行)

十年生死两茫茫
不思量,自难忘
千里孤坟,无处话凄凉
纵使相逢应不识,尘满面,鬓如霜
夜来幽梦忽还乡
小轩窗,正梳妆
相顾无言,惟有泪千行
料得年年肠断处,明月夜,短松冈
  1. 一#十年生死两茫茫
  2. 二#不思量,自难忘
  3. 三#千里孤坟,无处话凄凉
  4. 四#纵使相逢应不识,尘满面,鬓如霜
  5. 五#夜来幽梦忽还乡
  6. 六#小轩窗,正梳妆
  7. 七#相顾无言,惟有泪千行
  8. 八#料得年年肠断处,明月夜,短松冈
复制代码
——————————————————
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set s=一二三四五六七八
  4. set n=0
  5. for /f "delims=" %%a in (a.txt) do (
  6. call echo;%%s:~!n!,1%%#%%a
  7. set/a n+=1
  8. )
  9. pause>nul
复制代码
此题目好像有点难,先学习一下。
作者: for_flr    时间: 2021-11-26 15:43

本帖最后由 for_flr 于 2021-11-29 14:18 编辑

powershell解题思路跟上面bat是一样的,唉,感觉走错胡同巷子了。
用get-content获取文本内容。
  1. $n=0
  2. $str="一二三四五六七八"
  3. foreach ($line in get-content a.txt){write-host $str.substring($n,1)"#"$line;$n=$n+1}
复制代码
#get-content a.txt|foreach{write-host $str.substring($n,1)"#"$_;$n++}  #等同于上一句
  1. (get-content a.txt).count    #获取a.txt文本行数。
  2. (get-content a.txt)[0,3]    #获取第1和第4行,因为数组下标从0开始计数,可用负数表示倒数计数。
  3. (get-content a.txt)[0..3]    #获取第1到第4行,..两个点表示范围操作符。
  4. get-content a.txt -totalcount 4    #获取前4行,据说无需完全读取文本,某些情境可提高效率。
复制代码

作者: for_flr    时间: 2021-11-26 16:34

先列出接下来的几道题,有时间依次琢磨(题目挑选自本论坛批处理新手练功区)
10,获取当前目录路径
11,判断目录或文件是否存在
12,把文本的首行和尾行相拼接
13,过滤掉重复的行,然后保存到另一个文本文件
14,输入两个字母,显示它们之间的所有字母
15,字符串中的大小写互换
16,计算字符串长度
17,检查《千字文》是否有重复字
18,在控制台输出闪电图形
作者: for_flr    时间: 2021-11-29 10:16

第十,没啥好说的,用get-location,赋值到变量$a=get-location。

十一,批处理的if exist,powershell中有test-path,test-path还支持通配符
  1. if (test-path .\*.mp3){write-host "当前目录有MP3文件"}else{write-host "无"}
复制代码
12,把文本首行和尾行相拼接。
批处理1
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims= " %%a in (a.txt) do (set/a num+=1&set !num!=%%a)
  4. ::对每一行依次赋值到数字序列
  5. echo !1!!%num%!
复制代码
批处理2
  1. @echo off
  2. set /p a=<a.txt
  3. ::获取首行
  4. for /f "delims=" %%i in (a.txt) do set b=%%i
  5. ::依次将行内容赋值到变量b,直到最后一行。
  6. echo %a%%b%
  7. pause>nul
复制代码
powershell
(get-content a.txt)[0,-1]  #文本内容视为数组,0是第一行,-1是最后一行。
  1. (get-content a.txt)[0]+(get-content a.txt)[-1] #用+连接第一行和最后一行。
复制代码

作者: for_flr    时间: 2021-11-29 10:40

13,过滤掉重复的行,然后保存到另一个文本文件。假设有1.txt内容如下:
  1. 锄禾日当午
  2. 汗滴禾下土
  3. 锄禾日当午
  4. 锄禾日当午
  5. 谁知盘中餐
  6. 粒粒皆辛苦
  7. 白日依山尽
  8. 白日依山尽
  9. 白日依山尽
  10. 黄河入海流
  11. 粒粒皆辛苦
  12. 欲穷千里目
  13. 更上一层楼
  14. 更上一层楼
复制代码
批处理版:
  1. @echo off
  2. for /f "delims=" %%i in (1.txt) do (
  3.     if not defined %%i set %%i=1&echo;%%i>>2.txt
  4. )  
  5. pause
复制代码
powershell中有select-object,选择一个对象或一组对象的指定属性。它还可以从对象的数组中选择唯一对象,也可以从对象数组的开头或末尾选择指定个数的对象。
  1. get-content 1.txt|select-object -unique >2.txt
  2. # -unique ,从字符数组中选择唯一字符,即去除重复
复制代码
get-process | sort-object -property WS | select-object -Last 5
#此命令显示占用内存最多的五个进程。Sort-Object 用于按内存(工作集)使用量对进程排序,Select-Object 用于只选择所得到的对象数组的最后五个成员。
作者: for_flr    时间: 2021-11-29 10:50

本帖最后由 for_flr 于 2021-11-29 10:54 编辑

14题,要求:
    输入任意两个字母,显示这两个字母中间的所有字母。
如:  输入 af 则显示英文字母a至f  如: a  b c d e f
随风前辈批处理如下
  1. @echo off
  2. echo 请按先后顺序输入两个字母 如:af ,不能输入 fa
  3. set /p input=
  4. cls
  5. for %%b in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do (
  6. if /i "%input:~0,1%"=="%%b" set ok=ok
  7. if /i "%input:~1,1%"=="%%b" set ok=&echo %%b
  8. if defined ok echo %%b
  9. )
  10. echo.&pause&exit
复制代码
::从a到z逐字判断是否等于输入的两个字母。
作者: for_flr    时间: 2021-11-29 11:35

本帖最后由 for_flr 于 2021-11-29 13:06 编辑

powershell
  1. $str="abcdefghijklmnopqrstuvwxyz"
  2. $input=read-host "请输入两个字母"
  3. $sp=$input.substring(0,1)+"|"+$input.substring(1,1)
  4. ($str -split "$sp")[1]
复制代码
#将输入的字母视作分隔符,把字母表分割成3段,显示第二段。
-split的分割用法:
"张三-23-男-法外狂徒" -split "-"
我好傻,第三行应该用.insert()或者.chars()

——————————
根据24楼WHY前辈指点,可以简化为
  1. $s = 'abcdefghijklmnopqrstuvwxyz';
  2. $a = Read-Host '请输入两个字母';
  3. $s.Split($a)[1]
复制代码
而本人原答案中,
只知道-split 如果指定多个分隔符,应该用|符号隔开,如: "a|b"
所以用$sp=$input.substring(0,1)+"|"+$input.substring(1,1) 构建 a|b,徒增笑尔。
作者: for_flr    时间: 2021-11-29 12:26

15题,字符串中大小写互换
批处理1
  1. @echo off
  2. set "letters= abcdefghijklmnopqrstuvwxyzZYXWVUTSRQPONMLKJIHGFEDCBA"
  3. for /l %%a in (1,1,26) do call set /a "_%%letters:~%%a,1%%=%%a"
  4. :input
  5. setlocal EnableDelayedExpansion
  6. echo 请输入:&set /p var=&if not defined var endlocal&goto:input
  7. :loop
  8. set char=!var:~%pi%,1!
  9. set /a sn=_!char! 2>nul||set sn=0
  10. if defined char (
  11.     if %sn% gtr 0 (
  12.         if "!char!"=="!letters:~%sn%,1!" (set str=!str!!letters:~-%sn%,1!) else (set str=!str!!letters:~%sn%,1!)
  13.     ) else (
  14.         set str=!str!!char!
  15.     )
  16.     set /a pi+=1
  17.     goto loop
  18. )
  19. echo=!str!
  20. pause&endlocal&goto input
复制代码
批处理2
  1. @echo off & setlocal enabledelayedexpansion
  2. (for %%a in (a_A b_B c_C d_D e_E f_F g_G h_H i_I j_J k_K l_L m_M n_N o_O p_P q_Q r_R s_S t_T u_U v_V w_W x_X y_Y z_Z A_a B_b C_c D_d E_e F_f G_g H_h I_i J_j K_k L_l M_m N_n O_o P_p Q_q R_r S_s T_t U_u V_v W_w X_x Y_y Z_z) do echo;%%a)>temp.txt
  3. :loop
  4. cls&echo;输入混杂大小写的字母串(不超过15位)&set /p var=
  5. for /l %%b in (0,1,15) do (
  6. set "zifu=!var:~%%b,1!"
  7. if "!zifu!"=="" pause>nul&goto loop
  8. for /f "tokens=2 delims=_" %%c in ('findstr /b "!zifu!" temp.txt') do set /p=%%c<nul
  9. )
  10. pause&goto loop
复制代码

作者: for_flr    时间: 2021-11-29 12:44

本帖最后由 for_flr 于 2021-11-29 12:46 编辑

powershell
接触了foreach和split,字符串的.toupper()、.tolower()
那这题就太简单了
将字符串拆分成单子,逐字对比判断字符是大写还是小写,再转化
  1. $a="abcdABCD 123 XyZ"
  2. $a -split ""|foreach{if ($_ -ceq $_.tolower()){$na+=$_.toupper()}else{$na+=$_.tolower()}}
  3. $na
复制代码
powershell果然机具power!!
注: if 中的 eq代表等于,ceq代表等于且区分大小写
作者: WHY    时间: 2021-11-29 12:45

回复 20# for_flr
  1. $s = 'abcdefghijklmnopqrstuvwxyz';
  2. $a = Read-Host '请输入两个字母';
  3. $s.Split($a)[1]
复制代码
  1. $a = read-host "请输入两个字母";
  2. [char[]](([int]$a[0]+1)..([int]$a[1]-1));
复制代码

作者: for_flr    时间: 2021-11-29 13:09

16计算字符串长度
批处理
  1. @echo off
  2. set str=123ABC上中下
  3. :loop
  4. set /a a+=1
  5. set str=%str:~0,-1%
  6. if "%str%"=="" (echo %a%&pause>nul ) else goto loop
复制代码
powershell
  1. $str="123ABC上中下"
  2. $str.length
复制代码

作者: for_flr    时间: 2021-11-29 13:23

本帖最后由 for_flr 于 2021-11-29 14:37 编辑

17,检查千字文是否有重复字,且统计千字文文字数量,且将四字词语逆序输出
http://www.bathome.net/thread-12590-1-2.html
批处理代码不贴了,都在帖子里。
(题目作者很鸡贼,在txt末尾加了两个空行,其中一个空行里有个空格键.)
作者: for_flr    时间: 2021-11-29 14:51

第17,关于千字文的3个问题,
1,统计千字文数量,不含空格,共一千字。
  1. Get-Content 千字文.txt|foreach {$num+=($_.replace(" ","")).length}
  2. $num
  3. #去除每一行的空格后,累加文字长度
复制代码
坐等更效率的处理方式
2四字词语倒序输出
  1. get-content 千字文.txt|foreach {$new+=$_.split()}
  2. ($new)[-1..-$new.count]
  3. #将千字文逐行分成6个四字词语,累计存到变量new里,$new.count=588(含空行588行)
  4. #最后用数组的[-1..-588]形式,完成倒序输出
复制代码
视觉效果不理想,有空白行干扰
3,统计文中的重复字,暂无满意办法...
作者: for_flr    时间: 2021-11-29 15:38

本帖最后由 for_flr 于 2021-11-29 15:39 编辑

18,输出类似的闪电图形
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (1 1 11) do set "空格=!空格! "&set "星号=!星号!*"
  3. for /l %%a in (1 1 10) do echo !空格:~%%a!!空格:~%%a!!星号:~,%%a!
  4. for /l %%a in (10 -1 1) do echo !空格:~-%%a!!星号:~-%%a!
  5. pause
复制代码
powershell
  1. $a="*"
  2. for ($i=40;$i -ge 20;$i-=2){"{0,$i}" -f $a;$a=$a+"*"}
  3. for ($i=30;$i -ge 8;$i-=2){"{0,$i}" -f $a;$a=$a.remove(0,1)}
复制代码

作者: 心远先生    时间: 2021-11-29 17:26

回复 8# for_flr


    bathome写成hathome,新手看不懂容易误会,纠正下
作者: for_flr    时间: 2021-11-30 10:26

回复 28# 心远先生


    已改正,谢谢提醒。
另,借本楼贴出[system.io.path]的学习记录。
坛友提问:如何使用Powershell 将一个文件复制10份,文件名加后缀从1递增到10,如a.txt,复制出a1.txt,a2.txt到a10.txt
  1. $a="a.txt"
  2. for ($i=1;$i -le 10;$i++){copy $a (dir $a).name.insert(1,$i)}
复制代码
这样写不通用,搜索了一会儿,看到[system.io.path]::getxxx的用法,记录如下:
  1. $filename="test.mp3"
  2. $n=10
  3. $fn=[system.io.path]::getfilenamewithoutextension($filename)
  4. $fx=[system.io.path]::getextension($filename)
  5. for ($i=1;$i -le $n;$i++){copy-item $filename $fn$i$fx}
复制代码
  1. [system.io.path]::getfilename() #获取文件名
  2. [system.io.path]::getfilenamewithoutextension() #获取文件名,不含后缀
  3. [system.io.path]::getextension() #获取文件后缀名
  4. [system.io.path]::getfullpath() #获取全路径且带文件全名
  5. [system.io.path]::getdirectoryname() #获取文件父目录名   (括号里的文件名需要带绝对路径)
  6. [system.io.path]::getpathroot() #获取文件所在盘符        (括号里的文件名需要带绝对路径)
复制代码
不知道这种用法叫什么名字,不知道还有没有其他的,希望路过的大佬补充一下
作者: for_flr    时间: 2021-11-30 11:09

练一道题,第19,把每行中等于8个字符的字符串提取出来,其他行过滤掉。
示例文本 a.txt
  1. 12345678 abc cde
  2. 批处理之家
  3. 一二三四五六七八  abcdefgh
  4. 新手练功区欢迎大家
复制代码
其实字符串长度题目重复了,这里主要是套用两个foreach循环,练一练:
  1. $file=1.txt
  2. get-content $file|foreach{
  3.     foreach ($s in $_.split()) {
  4.     if ($s.length -eq 8) {$s}
  5.     }
  6. }
复制代码

作者: for_flr    时间: 2021-12-7 10:07

小结1:
有一定批处理基础,学习powershell的语法和各命令用法肯定是没有问题的。觉得难,其实主要是两个脚本思路完全不一样了。必须牢记powershell处理对象,了解各种对象本身具有哪些属性和方法,用语法组织这些属性方法解决问题。
作者: for_flr    时间: 2021-12-7 10:21

小结2:
回顾一楼第一题到30楼十九题。补充更正一些东西。
产生01-20递增序列
  1. foreach($a in 101..120){($a|out-string).remove(0,1)}
  2. 101..120|%{($_|out string).remove(0,1)} #之前没了解对象,错误理解了.remove()
  3. 1..20|%{"{0:d2}" -f $_}
复制代码
范围操作符..,表示连续数字。如-1..-9生成-1到-9的数组
格式化输出字符串-f,如下
  1. "{0,15}{1,15}{2,15}" -f 1,2,3
  2. "{0,15}{1,15}{2,15}" -f "hello","boy","!"
复制代码
固定字符长度,不足的补空格。{}大括号中,逗号前的数字表示-f后面所跟参数的下标。
{}大括号中,逗号后的数字表示字符占位长度
  1. ("{0,15}{1,15}{2,15}" -f 1,2,3).length  #用这两个可以加强印象
  2. ("{0,15}{1,15}{2,15}" -f "hello","boy","!").length
复制代码
  1. "{0:d8}" -f 3 #冒号后的d表示数字的补零,8表示8位
复制代码
冒号后还可以换f表示小数,p表示百分数,x表示16进制...

10秒倒计时
  1. foreach ($i in 10..1){$i;sleep -s 1}
复制代码
Measure-command{foreach ($i in 10..1){$i;sleep -s 1}}  #用measure看了下,挺精准。

类似for /f "delims= tokens=5"切割并挑选。
  1. "abc def 123 456 apple 123 45".split(" ")[4]
  2. ("abc-123-###-电源盒子-powershell" -split "-")[2,4]
复制代码
给小诗加汉字行号
  1. foreach($n in 0..7){"一二三四五六七八"[$n]+"#"+(gc a.txt)[$n]}
复制代码
建立1-10文件夹
  1. foreach($i in 1..10){md $i}
复制代码
  1. md (1..10)  #还能这样!
复制代码
关于这种格式用法[system.io.path]::getfilename()
::静态成员运算符,[]方括号中是类名。
类名::属性名     ,类名::方法名()  
.成员运算符
$对象.属性        ,$对象.方法()

千字文
  1. ((gc a.txt) -replace (" ","")|measure-object  -char).characters
复制代码
measure-command验证效率略高于原答案
  1. ((gc a.txt) -split(" ")|?{$_ -ne ""})[-1..-250] #逆序输出并去空行
复制代码

作者: for_flr    时间: 2021-12-22 17:22

千字文,统计重复单字
  1. $txt=(gc qzw.txt).split()|?{$_ -ne ""}
  2. $dic=@{}
  3. foreach($w in $txt){
  4. for($i=0;$i -le 3;$i++){
  5. if (!$dic.containskey($w[$i])){
  6. $dic[$w[$i]]=1
  7. } else {
  8. $dic[$w[$i]]+=1
  9. }
  10. }
  11. }
  12. write-host "千字文中有以下重复字"
  13. $dic.getenumerator()|?{$_.value -gt 1}
  14. [console]::readkey()
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2