我是 powershell 新手,希望得到一些帮助。我正在寻找一个 powershell 命令,它将搜索文件并查找字符串,然后根据找到的字符串值创建一个文件。
文件“abc.txt”中有一句话,如下所示,登录到 app\prog01但有时这个文件“abc.txt”中会有不同的 prog 和数字,比如 prog21 或 prog58。
当命令运行时,如果 abc.txt 有登录到 app\prog58在其中,它将创建一个名为 prog58 的简单文件,没有扩展名。
答案1
您需要Select-String
cmdlet,其默认别名为sls
。此 cmdlet 允许您匹配正则表达式,然后提取匹配的字符串。完整命令如下:
$(sls 'Logged into app\\prog[0-9]+' 'abc.txt' -all).matches | foreach { $fn=$_.value.split('\\')[1]; [System.IO.File]::Create($fn).close(); $fn }
Logged into app\\progX
基本上,对于它在文件中找到的字符串的每个实例(其中 X 是一个或多个数字),它会将其右侧的内容取\
到数字末尾,创建一个同名的文件,关闭该文件而不写入内容,并将该名称回显到标准输出(如果需要,可以删除最后一部分)。
答案2
我知道您需要 PowerShell 命令,但我即将提供的命令可能就足够了。
它将在标准 Cmd.exe shell 中运行,这意味着您也可以在 PowerShell 中运行它,并且它将与旧版 Windows 操作系统向后兼容:
TYPE abc.txt | FIND "Logged into app\prog58" >NUL && IF NOT DEFINED %ERRORLEVEL% (TYPE NUL >prog58)
不过,我可能误解了这个问题。您能否澄清一下这是否正是您要找的内容,或者您是否希望progXX
根据 abc.txt 中存在的任何文本创建一个名为的文件?
澄清后编辑: 以下内容也与 Cmd.exe 兼容,并且不是 PowerShell 独有的,因此虽然它不能用作单行脚本,但可以作为简单的批处理脚本调用:
@ECHO OFF
SETLOCAL && SETLOCAL EnableExtensions EnableDelayedExpansion
FOR /F "tokens=1-2 delims=\" %%A IN ('TYPE abc.txt ^| FINDSTR /C:"Logged into app\prog"') DO (SET FILENAME=%%B)
SET FILENAME=%FILENAME:~0,6%
TYPE NUL >%FILENAME%
警告:这依赖于progXX
恰好有 2 位数字,因此progXXX
不起作用。