Медленно для итерации цикла в пакетном файле - PullRequest
0 голосов
/ 01 октября 2018

Итак, я делаю пакетный скрипт и мне нужно запустить команду powershell внутри for, но он работает очень медленно, я не знаю, как сделать его более эффективным, я очень новичок в этом деле.Вот часть моего кода:

for /f "tokens=*" %%G in (myfile.txt) do (
       powershell -command '%%G' -replace ',+', ' ' >> newfile.txt
)

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Так как вы упомянули в своем комментарии, что пытаетесь сделать все это в пакетном скрипте, вот основной синтаксис для замены строки.Вы должны сначала присвоить переменную FOR переменной среды, прежде чем вы сможете выполнить какую-либо замену строки.Вам также необходимо включить отложенное расширение, поскольку вы управляете переменной внутри блока скобок.

@echo off
setlocal enabledelayedexpansion
(for /f "delims=" %%G in (myfile.txt) do (
    set "line=%%G"
    echo !line:+= !
)
)>newfile.txt

Вы также можете сделать это без отложенного расширения, используя CALL ECHO

@echo off
(for /f "delims=" %%G in (myfile.txt) do (
    set "line=%%G"
    CALL echo %%line:+= %%
)
)>newfile.txt
0 голосов
/ 01 октября 2018

Так как вы говорите, что вы новичок в этом.Это действительно важно, чтобы вы получили некоторое развитие темы.Используя все бесплатные материалы, которые предлагает Microsoft ( Виртуальная академия Microsoft или MS Channel9 или Виртуальные лаборатории TechNet или labsondemand ), или youtube или, как минимум, сначала просмотрите файлы справки.Есть также много бесплатных электронных книг и пошаговых блогов.

Как уже говорили другие, почему бы не сделать это непосредственно в PS, чтобы прочитать и обработать файл.Хотя вам и не нужно, вы можете вызвать .ps1 из .bat / .cmd / .vbs и т. Д., Но вам не нужно использовать его для обработки того, что может сделать PS.

# Giving a target file to be modified
# Check what is in the file
# Note: I am using Get-Content here, but if you have a .csv, then use the *csv* cmdlets

Get-Content -Path 'd:\temp\myfile.txt'

# Results

LIC,+CLIENT
12345,+Client1
54321,+Client2
34251,+Client3


# Test new file path

Test-Path -Path 'd:\temp\newfile.txt'

# Results

False

# Decide what to replace, code the replace 
# and see what the new file content will look like when replaced

Get-Content -Path 'd:\temp\myfile.txt' | 
ForEach{$_ -replace '\,\+',' '}

# Results

LIC CLIENT
12345 Client1
54321 Client2
34251 Client3

# Modify to send to a new file.
Get-Content -Path 'd:\temp\myfile.txt' | 
ForEach{
    $_ -replace '\,\+',' ' | 
    Out-File -FilePath 'D:\Temp\newfile.txt' -Append
}

# Results 
Test-Path -Path 'd:\temp\newfile.txt'
True

Get-Content -Path 'd:\temp\newfile.txt'

# Results, should be the same as screen output.

LIC CLIENT
12345 Client1
54321 Client2
34251 Client3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...