Лучший способ автоматизации на разных платформах - PullRequest
1 голос
/ 05 апреля 2020

Ежедневно я редактирую G-код для запуска на CO2-лазере, и я должен удалить одну и ту же строку из каждого файла перед его запуском. В настоящее время я открываю каждый файл в блокноте и делаю Ctrl + H и заменяю его таким образом. Я ищу более эффективный способ сделать это.

Мне дан пакет с номером прогона (ie 123456), и этот номер прогона соответствует каталогу в сети. В этом каталоге находится ряд файлов .txt или .n c, которые требуют удаления строки.

Каждый каталог выполнения содержится в файловой структуре, которая выглядит следующим образом

"\\ server \ x \ companyname \ 123456"

В \ companyname \ могут быть сотни каталогов прогонов, все 6 цифр - это номера прогонов и различны для каждого случая. Я хотел бы иметь возможность создать программу, которая запрашивает у меня номер прогона, а затем находит этот каталог в \ x или, вернее, полный путь при изменении \ companyname в зависимости от номера прогона, а затем заменяет строку в каждом файл в каталоге \ 123456. Таким образом, если строка Y11, и мне дали номер прогона 000001, мне будет предложено указать номер прогона, он найдет каталог и установит путь к \\ server \ x \ walmart \ 000001 \ и найдет каждый файл в этот каталог для строки Y11 и удалить его.

Я попытался использовать powershell и смог найти папку запуска с помощью Prompt и get-childitem с помощью -recurse и установил переменную с запросом для использования -include, однако система не разрешает сценарии!

Я не могу запустить сценарии, потому что это рабочий компьютер. Это говорит, что выполнение сценариев отключено в этой системе. В основном, get-executepolicy ограничено, и у меня нет этого сертификата.

Это код, который у меня есть.

$Run = Read-Host prompt "What is the run number?"
$Files = Get-ChildItem -Path "\\\server\x\" -Filter "$Run" -recurse
foreach ($file in $files)
   (Get-object $file.PSPath) | 
   Foreach-Object {$_ -replace "G33", ""} |
   Set-Content $file.PSPath

Последняя часть, начинающаяся с foreach, - это то, что я скопировал и вставил в предыдущем примере. У меня очень мало опыта работы с PowerShell. Таким образом, номер прогона находится в каталоге на два уровня ниже x \, и, когда пользователю будет предложено ввести номер прогона, я хочу, чтобы он выполнил поиск по всем x, найдите путь, включая каталог, который содержит номер прогона (walmart в пример выше), а затем получить все файлы в папке номера прогона. Эти файлы будут иметь путь, например

\ server \ x \ walmart \ 000001 \ 118000001_01.N C

В этой папке может быть много файлов, и все они должны иметь струна G33 снята с них.

Я новичок в этом, кто-то может объяснить, пожалуйста, шаг за шагом, используя powershell, visual basi c или любой метод, который вы считаете наиболее простым? Даже java! Я надеюсь, что смогу использовать это на ПК с различными операционными системами. В основном windows. Спасибо!

1 Ответ

0 голосов
/ 08 апреля 2020

Одним из возможных решений является наличие администратора для этого сервера, запускающего командлет PowerShell Set-ExecutionPolicy RemoteSigned, чтобы можно было выполнять локальные сценарии PowerShell. Обратите внимание, что в Windows 64-битной системе это может потребоваться как из 64-битной командной строки PowerShell, так и из 32-битной командной строки PowerShell, чтобы обеспечить возможность выполнения локальных сценариев PowerShell из любой PowerShell.

Другой подход заключается в использовании sed (сокращение от Stream Editor), классовой c Unix утилиты, доступной в Linux, macOS и Windows. Что касается последнего, поищите в Google UnixUtils на SourceForge, который включает sed и несколько других утилит classi c Unix, созданных для Windows. Sed может выполнять глобальный поиск и замену в текстовых файлах. Он не является интерактивным и предназначен для выполнения из скрипта (или пакетного файла).

VBScript также может читать каждый текстовый файл и выполнять поиск и замену. Вы можете открыть текстовый файл и с помощью al oop прочитать каждую строку. Если строка содержит строку поиска, замените этот текст (необязательно ничем), а затем запишите его; в противном случае напишите это без изменений. Вы записываете во временный файл по тому же пути, что и файл, который вы читаете, и когда вы закончите, вы удаляете исходный файл и переименовываете новый временный файл в исходное имя файла. Вы должны выполнить проверку ошибок на протяжении всего пути.

Что касается поиска подпапок по номеру прогона, вы, вероятно, можете сделать это с помощью пакетного файла (или сценария bash на Linux и macOS). , Примерно так:

@echo off

:get-directory-list
dir \\server\x /S /B /AD /OGNE > "C:\Users\Me\Desktop\ListOfDirectories.txt"

:prompt-runnumber
SET RUNNUMBER=
SET /P RUNNUMBER= Enter the 6-digit run number: 
if not defined RUNNUMBER echo invalid input & goto prompt-runnumber
if /i "%RUNNUMBER%" EQU "q" goto :EOF

:get-dir-for-run-number
type "C:\Users\Me\Desktop\ListOfDirectories.txt" | find "%RUNNUMBER%" > nul
if ERRORLEVEL 1 echo Run Number not found & goto prompt-runnumber
type "C:\Users\Me\Desktop\ListOfDirectories.txt" | find "%RUNNUMBER%" > %TEMP%\%~n0.tmp"
set /P RUNFOLDER= < "%TEMP%\%~n0.tmp"   
echo Run Folder full path is %RUNFOLDER%

:process-files-in-folder
for %%i in (%RUNFOLDER%\*.*) do (
    echo Processing folder %RUNFOLDER%, file %%i
    rem ... run sed, VBscript, etc. to edit file
)

Возможно, вам придется отредактировать указанный выше пакетный файл, чтобы использовать букву подключенного диска. Для bash необходимо сначала смонтировать сетевой ресурс и обратиться к точке монтирования «каталог».

bash предлагает соответствующие команды для вывода списка каталогов, их сортировки, поиска текстовых строк (используя grep вместо find), запрашивая ввод, читая ввод из текстовых файлов и т. д. c. И Windows Batch, и bash поддерживают подпрограммы (командные файлы могут вызывать себя и передавать метку в качестве параметра), если это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...