跨平台自动化的最佳方法

时间:2020-04-05 11:21:18

标签: windows powershell automation

我每天都编辑要在CO2激光器上运行的G代码,并且在运行之前必须从每个文件中删除相同的字符串。目前,我在记事本中打开每个文件,然后执行ctrl + h并用这种方式替换它。我正在寻找一种更有效的方法。

给我一​​个带有运行编号(即123456)的数据包,该运行编号对应于网络上的目录。该目录中有许多需要删除字符串的.txt或.nc文件。

每个运行目录都包含在如下所示的文件结构中

“ \\服务器\ x \公司名称\ 123456”

在\ companyname \中可能有数百个运行目录,所有6位数字-这些是运行号,每种情况下都不同。我希望能够创建一个程序,提示我输入运行编号,然后在\ x中找到该目录,或者根据\ companyname根据运行编号更改完整路径,然后在每个目录中替换字符串\ 123456目录中的文件。因此,如果字符串是Y11,并且给了我运行编号000001,则会提示我输入运行编号,它将搜索目录并将路径设置为\\ server \ x \ walmart \ 000001 \并在其中搜索每个文件。在此目录中输入字符串Y11并将其删除。

我尝试使用Powershell,并且能够使用Prompt找到运行文件夹,并使用-recurse找到get-childitem并设置了用于-include的提示变量,但是系统不允许脚本!

我不能运行脚本,因为它是一台工作计算机。它说脚本的执行在该系统上被禁用。基本上,get-executionpolicy设置为受限,我对此没有证书。

这是我到目前为止的代码

$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,请找到包含包含运行号的目录的路径(上面的示例),然后获取运行编号文件夹中的所有文件。这些文件的路径类似于

\服务器\ x \沃尔玛\ 000001 \ 118000001_01.NC

此运行文件夹中可能有很多文件,并且都需要从其中删除字符串G33。

我是新手,有人可以使用Powershell,Visual Basic或您认为最简单的任何方法逐步解释吗?甚至java!我希望能够在具有不同操作系统的PC上使用它。通常是窗户。谢谢!

1 个答案:

答案 0 :(得分:0)

一个可能的解决方案是让该服务器的管理员运行PowerShell的Set-ExecutionPolicy RemoteSigned Commandlet,以便可以执行本地PowerShell脚本。请注意,在Windows 64位上,可能需要同时从64位PowerShell提示符和32位PowerShell提示符进行此操作,以确保可以从任一PowerShell执行本地PowerShell脚本。

另一种方法是使用sed(Stream Editor的缩写),这是一个经典的Unix实用程序,可在Linux,macOS和Windows上使用。对于后者,请在SourceForge上的Google上搜索UnixUtils,其中包括sed和其他为Windows构建的经典Unix实用程序。 Sed可以在文本文件中进行全局搜索和替换。它是非交互式的,可以从脚本(或批处理文件)执行。

VBScript也可以读取每个文本文件并进行搜索和替换。您可以打开文本文件,并使用循环读取每一行。如果一行包含搜索字符串,则替换该文本(可选地不包含任何内容),然后将其写入;否则,将其写入未修改的位置。您以与要读取的文件相同的路径写入临时文件,完成后删除原始文件,并将新的临时文件重命名为原始文件名。您必须始终进行错误检查。

关于通过运行编号查找子文件夹,您可能可以使用批处理文件(或Linux和macOS上的bash脚本)进行操作。像这样:

@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),提示输入,从文本文件中读取输入等。Windows Batch和bash都支持子例程(批处理文件)可以自行调用并传递标签作为参数)。