PowerShell5 索引 [0] 到字符串的第一个实例,索引 [1] 到第二个实例,依此类推直到完成 6800 行 windows10 批处理文件
PowerShell5 index[0] to the first instance of the string, index[1] to the second instance and so on till finished on a 6800 line windows10 batch file
Powershell5 脚本因 Windows 10 批处理文件中的特殊字符而窒息,或者我的代码从根本上是错误的?
解析6800行Windows10个批处理文件,找到字符串{LINE2 1-9999}并将{1-9999}替换为代码所在的行号,重新编写批处理文件。 {LINE2 1-9999} 有 54 个实例。如果我解析整个批次,则会输出前 54 行,其中 none 包含字符串。
$lines = sls "LINE2" $env:windir\_61.bat | Select-Object -ExpandProperty LineNumber
gc $env:windir\_61.bat -OutVariable Content
$output = for ($index = 0; $index -lt $lines.count; $index++) {
$Content[$index] -replace "LINE2.*", "LINE2 $($lines[$index])"
}
$output | sc "$env:TEMP\somebadhat.bat"
如果_61.bat是:
TITLE %TIME% NO "%zmyapps1%\*.*" ARCHIVE ATTRIBUTE LINE2 1243
TITLE %TIME% DOC/SET YQJ8 LINE2 1887
SET ztitle=%TIME%: WINFOLD LINE2 2557
TITLE %TIME% _*.* IN WINFOLD LINE2 2597
TITLE %TIME% %%ZDATE1%% YQJ25 LINE2 3672
TITLE %TIME% FINISHED. PRESS ANY KEY TO SHUTDOWN ... LINE2 4922
结果:
TITLE %TIME% NO "%zmyapps1%\*.*" ARCHIVE ATTRIBUTE LINE2 1
TITLE %TIME% DOC/SET YQJ8 LINE2 2
SET ztitle=%TIME%: WINFOLD LINE2 3
TITLE %TIME% _*.* IN WINFOLD LINE2 4
TITLE %TIME% %%ZDATE1%% YQJ25 LINE2 5
TITLE %TIME% FINISHED. PRESS ANY KEY TO SHUTDOWN ... LINE2 6
如果_61.bat是:
TITLE %TIME% NO "%zmyapps1%\*.*" ARCHIVE ATTRIBUTE LINE2 1243
TITLE %TIME% DOC/SET YQJ8 LINE2 1887
SET ztitle=%TIME%: WINFOLD LINE2 2557
TITLE %TIME% _*.* IN WINFOLD LINE2 2597
TITLE %TIME% %%ZDATE1%% YQJ25 LINE2 3672
TITLE %TIME% FINISHED. PRESS ANY KEY TO SHUTDOWN ... LINE2 4922
:: Microsoft Windows [Version 10.0.17134.345] 64-BIT
@ECHO OFF
TITLE %TIME% FINISHED. PRESS ANY KEY TO SHUTDOWN ... LINE2 4923
结果:
TITLE %TIME% NO "%zmyapps1%\*.*" ARCHIVE ATTRIBUTE LINE2 1
TITLE %TIME% DOC/SET YQJ8 LINE2 2
SET ztitle=%TIME%: WINFOLD LINE2 3
TITLE %TIME% _*.* IN WINFOLD LINE2 4
TITLE %TIME% %%ZDATE1%% YQJ25 LINE2 5
TITLE %TIME% FINISHED. PRESS ANY KEY TO SHUTDOWN ... LINE2 6
:: Microsoft Windows [Version 10.0.17134.345] 64-BIT
@ECHO OFF
TITLE %TIME% FINISHED. PRESS ANY KEY TO SHUTDOWN ... LINE2 4923
丢失。
@有 30 个实例。例如:
SET p= & title NetFix v1.0a by Giovanni Heward (g@utahjrs.com) complete!
%PROGRAMFILES%-Zipz.exe" u -t7z -x@"%WINDIR%\_exclude7z.txt"
这是导致问题的原因吗?我会用什么代替它?为什么,如果我解析具有 54 个字符串实例的整个文件,它会输出 54 行,其中 none 包含字符串?我的代码有什么根本性的错误吗?
您的脚本将仅解析包含 "LINE2 nnnn" 标记的输入脚本的行数。因此,在上面的第二个输入示例中,在 9 行输入中,只有 7 行包含 "LINE2 nnnn",因此您只处理了前 7 行。原因是这样的:
$lines = sls "LINE2" c:\temp\_61.bat | Select-Object -ExpandProperty LineNumber
此行包含包含匹配文本的所有行的数组,因此 $lines
是一个包含 7 个整数的数组。稍后在您的 for 循环中,您只迭代那么多项目:
$output = for ($index = 0; $index -lt $lines.count; $index++) {
你并不真的需要 $lines
数组,只需在内容上使用循环索引来确定行号:
gc $env:windir\_61.bat -OutVariable Content
$output = for ($index = 0; $index -lt $Content.count; $index++) {
$Content[$index] -replace "LINE2.*", "LINE2 $($index)"
}
$output | sc "$env:TEMP\somebadhat.bat"
请注意,您可以通过管道推送所有数据,删除临时变量来稍微清理一下脚本:
gc $env:windir\_61.bat | foreach -begin {$lc = 1} -process {
$_ -replace "LINE2 \d*", "LINE2 $lc";
$lc += 1
} | out-file "$env:TEMP\somebadhat.bat"
只是为了可视化什么是Select-String returns以及如何替换基于索引的文件内容中的行号(zdan的方法效率更高)
## Q:\Test19\SO_54712715.ps1
$FilePath = '.\_61v2.bat'
$FileContent = Get-Content $FilePath
$FileMatches = Select-String -Path $FilePath -Pattern '(?<=LINE2 )\d+\s?$'
ForEach ($FM in $FileMatches){
"{0}:{1} [{2}=>{0}]" -f $FM.LineNumber,$FM.Line,$FM.Matches.Value
$FileContent[$FM.LineNumber-1] = $FM.Line.Replace($FM.Matches.Value,$FM.LineNumber)
}
$FileContent | Set-Content $FilePath
示例输出:
> Q:\Test19\SO_54712715.ps1
1:TITLE %TIME% NO "%zmyapps1%\*.*" ARCHIVE ATTRIBUTE LINE2 1243 [1243=>1]
2:TITLE %TIME% DOC/SET YQJ8 LINE2 1887 [1887=>2]
3:SET ztitle=%TIME%: WINFOLD LINE2 2557 [2557=>3]
4:TITLE %TIME% _*.* IN WINFOLD LINE2 2597 [2597=>4]
5:TITLE %TIME% %%ZDATE1%% YQJ25 LINE2 3672 [3672=>5]
6:TITLE %TIME% FINISHED. PRESS ANY KEY TO SHUTDOWN ... LINE2 4922 [4922=>6]
9:TITLE %TIME% FINISHED. PRESS ANY KEY TO SHUTDOWN ... LINE2 4923 [4923=>9]
和生成的文件内容(上述 bat 的版本 2)
> gc .\_61v2.bat
TITLE %TIME% NO "%zmyapps1%\*.*" ARCHIVE ATTRIBUTE LINE2 1
TITLE %TIME% DOC/SET YQJ8 LINE2 2
SET ztitle=%TIME%: WINFOLD LINE2 3
TITLE %TIME% _*.* IN WINFOLD LINE2 4
TITLE %TIME% %%ZDATE1%% YQJ25 LINE2 5
TITLE %TIME% FINISHED. PRESS ANY KEY TO SHUTDOWN ... LINE2 6
:: Microsoft Windows [Version 10.0.17134.345] 64-BIT
@ECHO OFF
TITLE %TIME% FINISHED. PRESS ANY KEY TO SHUTDOWN ... LINE2 9
Powershell5 脚本因 Windows 10 批处理文件中的特殊字符而窒息,或者我的代码从根本上是错误的?
解析6800行Windows10个批处理文件,找到字符串{LINE2 1-9999}并将{1-9999}替换为代码所在的行号,重新编写批处理文件。 {LINE2 1-9999} 有 54 个实例。如果我解析整个批次,则会输出前 54 行,其中 none 包含字符串。
$lines = sls "LINE2" $env:windir\_61.bat | Select-Object -ExpandProperty LineNumber
gc $env:windir\_61.bat -OutVariable Content
$output = for ($index = 0; $index -lt $lines.count; $index++) {
$Content[$index] -replace "LINE2.*", "LINE2 $($lines[$index])"
}
$output | sc "$env:TEMP\somebadhat.bat"
如果_61.bat是:
TITLE %TIME% NO "%zmyapps1%\*.*" ARCHIVE ATTRIBUTE LINE2 1243
TITLE %TIME% DOC/SET YQJ8 LINE2 1887
SET ztitle=%TIME%: WINFOLD LINE2 2557
TITLE %TIME% _*.* IN WINFOLD LINE2 2597
TITLE %TIME% %%ZDATE1%% YQJ25 LINE2 3672
TITLE %TIME% FINISHED. PRESS ANY KEY TO SHUTDOWN ... LINE2 4922
结果:
TITLE %TIME% NO "%zmyapps1%\*.*" ARCHIVE ATTRIBUTE LINE2 1
TITLE %TIME% DOC/SET YQJ8 LINE2 2
SET ztitle=%TIME%: WINFOLD LINE2 3
TITLE %TIME% _*.* IN WINFOLD LINE2 4
TITLE %TIME% %%ZDATE1%% YQJ25 LINE2 5
TITLE %TIME% FINISHED. PRESS ANY KEY TO SHUTDOWN ... LINE2 6
如果_61.bat是:
TITLE %TIME% NO "%zmyapps1%\*.*" ARCHIVE ATTRIBUTE LINE2 1243
TITLE %TIME% DOC/SET YQJ8 LINE2 1887
SET ztitle=%TIME%: WINFOLD LINE2 2557
TITLE %TIME% _*.* IN WINFOLD LINE2 2597
TITLE %TIME% %%ZDATE1%% YQJ25 LINE2 3672
TITLE %TIME% FINISHED. PRESS ANY KEY TO SHUTDOWN ... LINE2 4922
:: Microsoft Windows [Version 10.0.17134.345] 64-BIT
@ECHO OFF
TITLE %TIME% FINISHED. PRESS ANY KEY TO SHUTDOWN ... LINE2 4923
结果:
TITLE %TIME% NO "%zmyapps1%\*.*" ARCHIVE ATTRIBUTE LINE2 1
TITLE %TIME% DOC/SET YQJ8 LINE2 2
SET ztitle=%TIME%: WINFOLD LINE2 3
TITLE %TIME% _*.* IN WINFOLD LINE2 4
TITLE %TIME% %%ZDATE1%% YQJ25 LINE2 5
TITLE %TIME% FINISHED. PRESS ANY KEY TO SHUTDOWN ... LINE2 6
:: Microsoft Windows [Version 10.0.17134.345] 64-BIT
@ECHO OFF
TITLE %TIME% FINISHED. PRESS ANY KEY TO SHUTDOWN ... LINE2 4923
丢失。
@有 30 个实例。例如:
SET p= & title NetFix v1.0a by Giovanni Heward (g@utahjrs.com) complete!
%PROGRAMFILES%-Zipz.exe" u -t7z -x@"%WINDIR%\_exclude7z.txt"
这是导致问题的原因吗?我会用什么代替它?为什么,如果我解析具有 54 个字符串实例的整个文件,它会输出 54 行,其中 none 包含字符串?我的代码有什么根本性的错误吗?
您的脚本将仅解析包含 "LINE2 nnnn" 标记的输入脚本的行数。因此,在上面的第二个输入示例中,在 9 行输入中,只有 7 行包含 "LINE2 nnnn",因此您只处理了前 7 行。原因是这样的:
$lines = sls "LINE2" c:\temp\_61.bat | Select-Object -ExpandProperty LineNumber
此行包含包含匹配文本的所有行的数组,因此 $lines
是一个包含 7 个整数的数组。稍后在您的 for 循环中,您只迭代那么多项目:
$output = for ($index = 0; $index -lt $lines.count; $index++) {
你并不真的需要 $lines
数组,只需在内容上使用循环索引来确定行号:
gc $env:windir\_61.bat -OutVariable Content
$output = for ($index = 0; $index -lt $Content.count; $index++) {
$Content[$index] -replace "LINE2.*", "LINE2 $($index)"
}
$output | sc "$env:TEMP\somebadhat.bat"
请注意,您可以通过管道推送所有数据,删除临时变量来稍微清理一下脚本:
gc $env:windir\_61.bat | foreach -begin {$lc = 1} -process {
$_ -replace "LINE2 \d*", "LINE2 $lc";
$lc += 1
} | out-file "$env:TEMP\somebadhat.bat"
只是为了可视化什么是Select-String returns以及如何替换基于索引的文件内容中的行号(zdan的方法效率更高)
## Q:\Test19\SO_54712715.ps1
$FilePath = '.\_61v2.bat'
$FileContent = Get-Content $FilePath
$FileMatches = Select-String -Path $FilePath -Pattern '(?<=LINE2 )\d+\s?$'
ForEach ($FM in $FileMatches){
"{0}:{1} [{2}=>{0}]" -f $FM.LineNumber,$FM.Line,$FM.Matches.Value
$FileContent[$FM.LineNumber-1] = $FM.Line.Replace($FM.Matches.Value,$FM.LineNumber)
}
$FileContent | Set-Content $FilePath
示例输出:
> Q:\Test19\SO_54712715.ps1
1:TITLE %TIME% NO "%zmyapps1%\*.*" ARCHIVE ATTRIBUTE LINE2 1243 [1243=>1]
2:TITLE %TIME% DOC/SET YQJ8 LINE2 1887 [1887=>2]
3:SET ztitle=%TIME%: WINFOLD LINE2 2557 [2557=>3]
4:TITLE %TIME% _*.* IN WINFOLD LINE2 2597 [2597=>4]
5:TITLE %TIME% %%ZDATE1%% YQJ25 LINE2 3672 [3672=>5]
6:TITLE %TIME% FINISHED. PRESS ANY KEY TO SHUTDOWN ... LINE2 4922 [4922=>6]
9:TITLE %TIME% FINISHED. PRESS ANY KEY TO SHUTDOWN ... LINE2 4923 [4923=>9]
和生成的文件内容(上述 bat 的版本 2)
> gc .\_61v2.bat
TITLE %TIME% NO "%zmyapps1%\*.*" ARCHIVE ATTRIBUTE LINE2 1
TITLE %TIME% DOC/SET YQJ8 LINE2 2
SET ztitle=%TIME%: WINFOLD LINE2 3
TITLE %TIME% _*.* IN WINFOLD LINE2 4
TITLE %TIME% %%ZDATE1%% YQJ25 LINE2 5
TITLE %TIME% FINISHED. PRESS ANY KEY TO SHUTDOWN ... LINE2 6
:: Microsoft Windows [Version 10.0.17134.345] 64-BIT
@ECHO OFF
TITLE %TIME% FINISHED. PRESS ANY KEY TO SHUTDOWN ... LINE2 9