好的,这就是我要做的事情: 我想制作一个小的PowerShell脚本,它接收我的音乐库的每个文件,然后对它进行哈希求和并将其写入文件中,如下所示:
test.txt; 131 136 80 89 119 17 60 123 210 121 188 42 136 200 131 198
现在,当我开始编写脚本时,我需要首先将我的音乐库与已有的值进行比较,但为此我只想在切断之后切断所有内容。这样它可以将文件名与文件名(或文件路径)进行比较......但是我很难过如何做到这一点,尝试用 $ name = $ name -replace“; *”,“” 不去......
尝试过滤......不知道D:
我真的很感激帮助。
另外如果您认为我使用的是错误的编码语言,请告诉我什么会更好,只是我只使用过C和powershell
答案 0 :(得分:40)
$pos = $name.IndexOf(";")
$leftPart = $name.Substring(0, $pos)
$rightPart = $name.Substring($pos+1)
在内部,PowerShell使用String class。
答案 1 :(得分:6)
$text = "test.txt ; 131 136 80 89 119 17 60 123 210 121 188 42 136 200 131 198"
$text.split(';')[1].split(' ')
答案 2 :(得分:2)
您可以使用 Split
:
$text = "test.txt ; 131 136 80 89 119 17 60 123 210 121 188 42 136 200 131 198"
$separator = ";" # you can put many separator like this "; : ,"
$parts = $text.split($separator)
echo $parts[0] # return test.txt
echo $parts[1] # return the part after the separator
答案 3 :(得分:1)
这适用于分隔符之间特定字符数量的特定分隔符。我有很多问题试图在每个循环中使用它,其中位置改变但是分隔符是相同的。例如,我使用反斜杠作为分隔符,并且只想使用反斜杠右侧的所有内容。问题是,一旦定义了位置(从一开始就有71个字符),无论分隔符在脚本中的实际位置如何,每次都会使用$ pos作为71。我找到了另一种使用分隔符和.split来分解的方法,然后使用split变量来调用节。例如,第一节是$ variable [0],第二节是$ variable [1]。
答案 4 :(得分:0)
我的文件中包含一些名为invoice no-product no.pdf的文件,并希望按产品编号排序,所以......
get-childitem *.pdf | sort-object -property @{expression={$\_.name.substring($\_.name.indexof("-")+1)}}
请注意,如果没有-
,请按$_.name
答案 5 :(得分:0)
使用正则表达式,结果为$ matches [1]:
$str = "test.txt ; 131 136 80 89 119 17 60 123 210 121 188 42 136 200 131 198"
$str -match "^(.*?)\s\;"
$matches[1]
test.txt
答案 6 :(得分:0)
$name -replace ";*",""
您很亲密,但是您使用的是wildcard expresson而不是regular expression的语法,这正是-replace
operator的期望。
因此(哈希序列缩短):
PS> 'test.txt ; 131 136 80 89 119 17 60 123 210 121 188' -replace '\s*;.*'
test.txt
注意:
省略替换文本操作数(第二个RHS操作数)将隐式使用""
(空字符串),即有效地删除正则表达式匹配的内容。
.*
表示正则表达式中字符(*
)的潜在空行(.
)-它与*
的正则表达式等效em>本身在通配符表达式中。
在正则表达式中的\s*
之前添加;
也会删除文件名后的尾随空格(\s
)。
我使用'...'
而不是"..."
来封装正则表达式,以防止在PowerShell预先展开的内容(请参阅expandable strings in PowerShell和.NET内容之间造成混淆)正则表达式引擎可以看到。