簡體   English   中英

使用 Batch 和 Powershell 替換 txt 文件中的多個字符串

[英]Replace multiple strings in txt file using Batch and Powershell

我已經構建了一個運行 BTEQ 腳本並在 txt 文件中返回數據的批處理文件。 但是,我正在擴展我的代碼以允許用戶輸入 user_id、密碼和句點參數 YYYYMM。 我最初將我的個人登錄信息硬編碼到 BTEQ 文件中,並像這樣僅使用快照參數進行測試。

echo off
SETLOCAL ENABLEEXTENSIONS DISABLEDELAYEDEXPANSION
SET /P SNAPSHOT="What snapshot should I use [YYYYMM]?"
DEL EXPORT.TXT
POWERSHELL -COMMAND "(GET-CONTENT TEST.TXT) | FOREACH-OBJECT {$_ -REPLACE \"\?YYYYMM\"", %SNAPSHOT% "} | OUT-FILE TEST.TXT";
bteq < test.txt > output.txt 2>&1
POWERSHELL -COMMAND "(GET-CONTENT TEST.TXT) | FOREACH-OBJECT {$_ -REPLACE " %SNAPSHOT% ,"\"?YYYYMM\"} | OUT-FILE TEST.TXT";
@echo off goto end
en @echo exit

代碼按預期工作。 但是,當我 go 添加用戶名和密碼時,我只需復制 PowerShell 的快照代碼並根據需要替換變量。

echo off
SETLOCAL ENABLEEXTENSIONS DISABLEDELAYEDEXPANSION
SET /P USER_ID=Enter User ID:
SET /P USER_PASSWORD=Enter Password:
SET /P SNAPSHOT="What snapshot should I use [YYYYMM]?"
DEL EXPORT.TXT
POWERSHELL -COMMAND "(GET-CONTENT TEST.TXT) | FOREACH-OBJECT {$_ -REPLACE \"$USER_ID\"", %USER_ID% "} | OUT-FILE TEST.TXT";
POWERSHELL -COMMAND "(GET-CONTENT TEST.TXT) | FOREACH-OBJECT {$_ -REPLACE \"\$USERPASSWORD\"", %USER_PASSWORD% "} | OUT-FILE TEST.TXT"; 
POWERSHELL -COMMAND "(GET-CONTENT TEST.TXT) | FOREACH-OBJECT {$_ -REPLACE \"\?YYYYMM\"", %SNAPSHOT% "} | OUT-FILE TEST.TXT";
bteq < test.txt > output.txt 2>&1
::POWERSHELL -COMMAND "(GET-CONTENT TEST.TXT) | FOREACH-OBJECT {$_ -REPLACE " %SNAPSHOT% ,"\"?YYYYMM\"} | OUT-FILE TEST.TXT";
@echo off goto end
en @echo exit

快照代碼仍然有效,但我收到 User_ID 和 User_Password 用戶輸入錯誤。 如下:

Enter User ID:userTest
Enter Password:TestPass
What snapshot should I use [YYYYMM]?202102

At line:1 char:66
+ ... -CONTENT TEST.TXT) | FOREACH-OBJECT {$_ -REPLACE "\$USER_ID", userTes ...
+                                                                  ~
Missing expression after ','.
At line:1 char:67
+ ... TEST.TXT) | FOREACH-OBJECT {$_ -REPLACE "\$USER_ID", userTest } | OUT ...
+                                                          ~~~~~~~~
Unexpected token 'userTest' in expression or statement.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingExpressionAfterToken

At line:1 char:71
+ ... ENT TEST.TXT) | FOREACH-OBJECT {$_ -REPLACE "\$USERPASSWORD", TestPas ...
+                                                                  ~
Missing expression after ','.
At line:1 char:72
+ ... TXT) | FOREACH-OBJECT {$_ -REPLACE "\$USERPASSWORD", TestPass } | OUT ...
+                                                          ~~~~~~~~
Unexpected token 'TestPass' in expression or statement.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingExpressionAfterToken

這是我的建議,使用我評論中建議的語法,但不是 PowerShell 的多個實例,而是一個:

%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -Command "(Get-Content -Path \".\test.txt\") | ForEach-Object { $_.Replace(\"`$USER_ID\", \"%USER_ID%\").Replace(\"`$USERPASSWORD\", \"%USER_PASSWORD%\").Replace(\"?YYYYMM\", \"%SNAPSHOT%\") } | Set-Content -Path \".\test.txt\""

如果您更喜歡在PowerShell中使用單引號(在這種情況下更易於閱讀和理解) ,那么:

%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -Command "(Get-Content -Path '.\test.txt') | ForEach-Object { $_.Replace('$USER_ID', '%USER_ID%').Replace('$USERPASSWORD', '%USER_PASSWORD%').Replace('?YYYYMM', '%SNAPSHOT%') } | Set-Content -Path '.\test.txt'"

這些示例基於我對您的代碼應該在test.txt中替換的內容的解釋,即文字字符串$USER_ID$USERPASSWORD?YYYYMM

要將%SNAPSHOT%的字符串值返回到文字字符串?YYYYMM ,在運行bteq命令后(正如您在代碼中所使用的那樣) ,您可以使用以下任一方法:

%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -Command "(Get-Content -Path \".\test.txt\") | ForEach-Object { $_.Replace(\"%SNAPSHOT%\", \"?YYYYMM\") } | Set-Content -Path \".\test.txt\""

或者

%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -Command "(Get-Content -Path '.\test.txt') | ForEach-Object { $_.Replace('%SNAPSHOT%', '?YYYYMM') } | Set-Content -Path '.\test.txt'"

如果您要返回所有三個字符串,而不僅僅是一個,那么您可以使用您選擇的第一個示例,並切換每個字符串對的位置。 但是,為此,我似乎更簡單,只是Set-Conent為一個新文件,使用它,然后刪除,而不是繼續修改同一個文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM