
我是 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
不起作用。